Rails 3 уровня глубоко вложенных ресурсов

Я знаю, что многие разработчики рельсов говорят, что вложение ваших ресурсов глубиной более 2 уровней - это неправильно. Я также согласен, потому что становится грязно, когда ваши URL выглядят как mysite.com/account/1/people/1/notes/1. Я пытаюсь найти способ использовать вложенные ресурсы, но не вкладывая их в 3 уровня.

Это неправильный способ сделать это, так как разработчики rails не рекомендуют его, а также очень трудно понять, как это вложить в контроллер или представление формы.

resources :account do 
  resources :people do
    resources :notes
  end
end

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

resources :account do 
  resources :people
end

resources :people do
  resources :notes
end

Вот проблема, с которой я всегда сталкиваюсь. Когда я захожу в учетную запись / 1 / people, я могу добавить в учетную запись человека и сказать, что URL-адрес похож на mysite.com/account/1/people/1, и это прекрасно работает.

Теперь, если я пытаюсь получить доступ к mysite.com/people/1/notes из учетной записи 1, я получаю ошибку

Can't find people without and account id

Как заставить это работать должным образом?

Ответы на вопрос(1)

насколько вам нравится, так как rails 3.x позволяет выровнять их, используя shallow: true

Попробуйте поэкспериментировать с

resources :account, shallow: true do 
  resources :people do
    resources :notes
  end
end

Используйте маршруты рейка, чтобы увидеть, что вы получаете :)

UPDATE in response to comment

Как я уже сказал, поиграйте с маршрутами рейка, чтобы увидеть, какие URL вы можете получить.

resources :account, shallow: true do 
  resources :people, shallow: true do
    resources :notes
  end
end

получает вам эти маршруты

:~/Development/rails/routing_test$ rake routes
      person_notes GET    /people/:person_id/notes(.:format)        notes#index
                   POST   /people/:person_id/notes(.:format)        notes#create
   new_person_note GET    /people/:person_id/notes/new(.:format)    notes#new
         edit_note GET    /notes/:id/edit(.:format)                 notes#edit
              note GET    /notes/:id(.:format)                      notes#show
                   PUT    /notes/:id(.:format)                      notes#update
                   DELETE /notes/:id(.:format)                      notes#destroy
    account_people GET    /account/:account_id/people(.:format)     people#index
                   POST   /account/:account_id/people(.:format)     people#create
new_account_person GET    /account/:account_id/people/new(.:format) people#new
       edit_person GET    /people/:id/edit(.:format)                people#edit
            person GET    /people/:id(.:format)                     people#show
                   PUT    /people/:id(.:format)                     people#update
                   DELETE /people/:id(.:format)                     people#destroy
     account_index GET    /account(.:format)                        account#index
                   POST   /account(.:format)                        account#create
       new_account GET    /account/new(.:format)                    account#new
      edit_account GET    /account/:id/edit(.:format)               account#edit
           account GET    /account/:id(.:format)                    account#show
                   PUT    /account/:id(.:format)                    account#update
                   DELETE /account/:id(.:format)                    account#destroy

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

Вам действительно нужно поработать над действиями, чтобы убедиться, что вы предпринимаете соответствующие действия, когда параметры id не передаются, поэтому, если вы используете идентификатор для конкретной модели, проверьте, что идентификатор находится в списке параметров, и если нет, воспользуйтесь альтернативным вариантом. действие. например если вы не передаете идентификатор учетной записи, убедитесь, что вы не пытаетесь его использовать

В вашем комментарии говорится, что вы уже используете неглубокие маршруты, но это не то, что вы опубликовали в своем вопросе?

 19 мая 2012 г., 12:21
Я обновил ответ. Надеюсь, что проясняет вещи
 Yooku19 мая 2012 г., 03:58
В настоящее время в моем файле маршрутов есть мелкая правда, просто я не уверен, как получить доступ к людям / заметкам без идентификатора учетной записи. Rails выдает эту ошибкуCouldn't find Account without an ID

Ваш ответ на вопрос