2016-12-16 38 views
2

моих иерархий данных «Case» имеет много «Категории» имеетрельсы маршруты не могут перенаправлять правильно

Я последовал документ многая «Задачи», что ресурсы не должны быть вложен более чем на 1 уровень глубокого. Поэтому я использую неглубоко, как показано ниже:

моего routes.rb

resources :cases do 
    resources :categories, :shallow => true do 
     resources :tasks, :shallow => true 
    end 
end 

реки маршруты

 category_tasks GET /categories/:category_id/tasks(.:format)  tasks#index 
         POST /categories/:category_id/tasks(.:format)  tasks#create 
    new_category_task GET /categories/:category_id/tasks/new(.:format) tasks#new 
      edit_task GET /tasks/:id/edit(.:format)     tasks#edit 
        task GET /tasks/:id(.:format)       tasks#show 
         PATCH /tasks/:id(.:format)       tasks#update 
         PUT /tasks/:id(.:format)       tasks#update 
         DELETE /tasks/:id(.:format)       tasks#destroy 
     case_categories GET /cases/:case_id/categories(.:format)   categories#index 
         POST /cases/:case_id/categories(.:format)   categories#create 
    new_case_category GET /cases/:case_id/categories/new(.:format)  categories#new 
     edit_category GET /categories/:id/edit(.:format)    categories#edit 
       category GET /categories/:id(.:format)     categories#show 
         PATCH /categories/:id(.:format)     categories#update 
         PUT /categories/:id(.:format)     categories#update 
         DELETE /categories/:id(.:format)     categories#destroy 
       cases GET /cases(.:format)        cases#index 
         POST /cases(.:format)        cases#create 
       new_case GET /cases/new(.:format)       cases#new 
      edit_case GET /cases/:id/edit(.:format)     cases#edit 
        case GET /cases/:id(.:format)       cases#show 
         PATCH /cases/:id(.:format)       cases#update 
         PUT /cases/:id(.:format)       cases#update 
         DELETE /cases/:id(.:format)       cases#destroy 
        root GET /           cases#index 

Я положил взгляд категории в случае/show.html.erb чтобы показать категории в этом случае.

URL-адрес из случаев # шоу LOCALHOST: 3000/корпуса/9

, если я хочу, чтобы создать новую категорию ссылка будет локальный: 3000/футляры/9/категории/новый

он хорошо работает в тех случаях redirect_to # показать страницу с моей категории # создать действие

def create 
    @case = Case.find(params[:case_id]) 
    @category = Category.new(category_params) 
    @category.case = @case 
    @case.member = current_member 

    if @category.save 
     redirect_to case_path(@case) 
    else 
     render :new 
    end 
end 

, но когда я пытаюсь изменить категорию и обновить его

url изменить на localhost: 3000/categories/2/изменить что у меня больше нет case_id.

не может перенаправить обратно в случае # показать страницу LOCALHOST: 3000/случаи/9

Я попытался написать подобный код, как мой создать действие, как показано ниже

def update 
    @case = Case.find(params[:case_id]) 
    @category = Category.find(params[:id]) 
    @category.case = @case 

    if @category.update(category_params) 
     redirect_to case_path(@case) 
    else 
     render :edit 
    end 
end 

но это не может получить case_id и сообщение об ошибке, как показано ниже

Couldn't find Case with 'id'= 

как я могу перенаправить к локального хоста: 3000/случаи/9 после редактирования и обновления «категории»?

+0

Вы хотите изменить ситуацию, когда редактируете эту категорию? – Jayaprakash

+0

Привет, @Jayaprakash Я не хочу изменять случай, когда редактирую категорию. категории относятся к делу. – sarahbones

+0

От вашего 'localhost: 3000/cases/9/categories/new'. Когда категория была создана успешно. Вы проверили его 'case_id'? Это 9 или «ноль»? Я думаю, есть некоторая ошибка здесь –

ответ

1

shallow: true изменил edit_category на мелкий маршрут согласно document. Идентификатор родительского ресурса на мелком маршруте отсутствует.

Вместо этого вы можете использовать @case = @category.case. Нет необходимости в category_id param

+0

жаль, что у меня недостаточно репутации, чтобы проголосовать за ваш ответ, я уже два дня искал ответ, спасибо большое! – sarahbones

0

Поскольку вы не хотите изменять регистр при редактировании категории, попробуйте нижний.

def update 
    @category = Category.find(params[:id]) 
    @case = @category.case 

    if @category.update(category_params) 
     redirect_to case_path(@case) 
    else 
     render :edit 
    end 
end 
+0

Я пробовал это решение, и он показал другую ошибку. Никакой маршрут не соответствует {: action => "show",: controller => "cases",: id => nil} missing required keys: [: id] – sarahbones

+0

ответ от @ w11th работал на мой случай! – sarahbones

+0

Да. Я пропустил этот метод переадресации с переменной «@case». Как сказал @ w11th, вы можете получить доступ к этому случаю из категории, поскольку он уже существует в БД. Обновлен мой ответ. – Jayaprakash