Трэвис Р правильно. (Хотелось бы, чтобы я голосовал против тебя.) Я просто получил эту работу сам. С этими маршрутами:
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?" %>
То, что говорит джамураа, может работать в контексте Статьи, но у меня это не сработало в других отношениях.
Существует много дискуссий, связанных с вложенными ресурсами, например, http://weblog.jamisbuck.org/2007/2/5/nesting-resources
Интересно, что я только что узнал, что юнит-тесты большинства людей на самом деле не проверяют все пути. Когда люди следуют предложению Джеймисбак, они получают два способа получить доступ к вложенным ресурсам. Их юнит-тесты, как правило, получают / отправляют в самые простые:
# 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
Извините за длинный ответ. Я думаю, что не многие знают о тонкостях.