我有两个这样的模型:
class Topic < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :user
belongs_to :topic
has_many :comments
end
我已经像这样设置了资源映射:
map.resources :topics do |topic|
topic.resources :articles
end
当我拨打相应的网址(例如/:topic_slug/articles/2
)时,我可以很好地查看文章。在我的文章的观点中,我使用部分来处理文章的创建和编辑,如下所示:
<% form_for(@article) do |f| %>
...
<% end %>
问题是我试图创建新文章或编辑现有文章时出现以下错误:
NoMethodError in Articles#new
Showing app/views/articles/_form.html.erb where line #1 raised:
undefined method `articles_path' for #<ActionView::Base:0x103d11dd0>
Extracted source (around line #1):
1: <% form_for(@article) do |f| %>
2: <%= f.error_messages %>
3:
4: <p>
Trace of template inclusion: app/views/articles/new.html.erb
有谁知道我哪里出错了,我错过了什么?
答案 0 :(得分:4)
您还需要传递主题:
<% form_for([@topic, @article]) do |f| %>
当您仅将@article
传递给form_for
时,它会尝试根据@article
生成正确的路径 - 这就是为什么您的错误表明您没有article_path
方法。当您将[@topic, @article]
传递给form_for
时,请将topic_article_path
传递给@topic
。
如果您在创建新文章时没有 map.resources :articles
,那么您可能需要指定接受没有主题的文章的新路线,因此请添加:
<% form_for(@article) do |f| %>
然后:
/articles/3
会有效,但它会生成如:{{1}}的网址 - 没有主题部分。
答案 1 :(得分:0)
如果您想要文章的非嵌套路线,也可以单独映射文章:
map.resources :articles