Rails map.resources&帮手网址

时间:2010-01-31 13:21:03

标签: ruby-on-rails url-routing

我有两个这样的模型:

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

有谁知道我哪里出错了,我错过了什么?

2 个答案:

答案 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