Тревис R правильный. (Хотелось бы, чтобы я мог упрекнуть тебя.) Я только что занялся этим. С помощью этих маршрутов:
resources :articles do
resources :comments
end
Вы получаете пути, такие как:
/articles/42
/articles/42/comments/99
, направляемые на контроллеры в
app/controllers/articles_controller.rb
app/controllers/comments_controller.rb
так же, как говорится в http://guides.rubyonrails.org/routing.html#nested-resources , без специальных пространств имен.
Но частичные и формы становятся сложными. Обратите внимание на квадратные скобки:
<%= form_for [@article, @comment] do |f| %>
Самое главное, если вы хотите URI, вам может понадобиться что-то вроде этого:
article_comment_path(@article, @comment)
Альтернативно:
[@article, @comment]
, как описано в http://edgeguides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects
Например, внутри сборники, частичные с comment_item
, предоставленные для итерации,
<%= link_to "delete", article_comment_path(@article, comment_item),
:method => :delete, :confirm => "Really?" %>
. Что говорит jamuraa, может работать в контексте статьи, но это не сработало для меня различными способами.
Существует много обсуждений, связанных с вложенными ресурсами, например http://weblog.jamisbuck.org/2007/2/5/nesting-resources
Интересно, что я только что узнал, что блок-тесты большинства людей фактически не проверяют все пути , Когда люди следуют предложению Jamisbuck, у них есть два способа получить доступ к вложенным ресурсам. Их модульные тесты обычно получаются / публикуются до самых простых:
# POST /comments
post :create, :comment => {:article_id=>42, ...}
. Чтобы проверить маршрут, который они могут предпочесть, они должны сделать это следующим образом:
# POST /articles/42/comments
post :create, :article_id => 42, :comment => {...}
Я узнал об этом, потому что мои модульные тесты начали сбой, когда я переключился с этого:
resources :comments
resources :articles do
resources :comments
end
на это:
resources :comments, :only => [:destroy, :show, :edit, :update]
resources :articles do
resources :comments, :only => [:create, :index, :new]
end
Я думаю, это нормально, чтобы иметь повторяющиеся маршруты, и пропустить несколько модульных тестов. (Почему тест? Потому что, даже если пользователь никогда не видит дубликаты, ваши формы могут ссылаться на них либо неявно, либо через именованные маршруты.) Тем не менее, чтобы свести к минимуму ненужное дублирование, я рекомендую следующее:
resources :comments
resources :articles do
resources :comments, :only => [:create, :index, :new]
end
Извините за длинный ответ. Думаю, мало кто знает о тонкостях.