ruby-on-rails – form_for与嵌套资源

我有一个两部分关于form_for和嵌套资源的问题。让我们说,我写一个博客引擎,我想关注一篇文章的评论。我已经定义了一个嵌套的资源如下:

map.resources :articles do |articles|
    articles.resources :comments
end

注释表单位于文章的show.html.erb视图中,位于文章本身的下方,例如:

<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
    <%= f.text_area :text %>
    <%= submit_tag "Submit" %>
<%  end %>

这给出一个错误,“调用id为nil,这会错误地等”我也试过

<% form_for @article, @comment do |f| %>

它正确呈现,但将f.text_area与文章的“文本”字段而不是注释相关联,并在该文本区域中显示article.text属性的html。所以我似乎也有这个错。我想要的是一个表单,其’submit’将调用CommentsController上的create操作,在params中有一个article_id,例如/ article / 1 / comments的post请求。

我的问题的第二部分是,什么是创建注释实例开始的最好的方法?我在ArticlesController的show操作中创建一个@comment,所以一个注释对象将在form_for帮助器的作用域中。然后在CommentsController的创建操作中,我使用从form_for传入的params创建新的@comment。

谢谢!

最佳答案
Travis R是正确的。 (我希望我可以upvote ya。)我只是让自己工作。使用这些路线:

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的集合partial中,

<%= 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

对不起,答案很长。没有多少人知道微妙的,我想。

转载注明原文:ruby-on-rails – form_for与嵌套资源 - 代码日志