嵌套资源的form_for嵌套资源的form_for(form_for with nested re

2019-05-08 22:03发布

我对的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的零,这将误将等。” 我也试着

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

其正确呈现,但涉及到f.text_area,而不是评论的文章的“文本”字段,并提出了在该文本区域article.text属性的HTML。 所以,我似乎都有这个毛病也是如此。 我要的是一个形式,其“提交”将呼吁CommentsController的创建行动,在PARAMS的article_id的,比如一个POST请求/用品/ 1 /评论。

第二部分,我的问题是,什么是创建注释实例开始的最佳方式? 我创建的ArticlesController的表演动作@comment,所以评论的对象将在规模为的form_for帮手。 然后在CommentsController的创造作用,我创建使用从的form_for传入的PARAMS新@comment。

谢谢!

Answer 1:

特拉维斯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的建议下,他们最终以两种方式来获得在嵌套的资源。 他们的单元测试通常将GET / POST到最简单的:

# 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

很抱歉的长期答案。 不是很多人都知道的细微之处,我想。



Answer 2:

一定要在控制器中创建两个对象: @post@comment的职位名称,例如:

@post = Post.find params[:post_id]
@comment = Comment.new(:post=>@post)

然后在视图:

<%= form_for([@post, @comment]) do |f| %>

一定要在明确的form_for定义数组,不只是逗号分隔像你有以上。



Answer 3:

你并不需要做特别的事情的形式。 你只要建立正确的注释在show动作:

class ArticlesController < ActionController::Base
  ....
  def show
    @article = Article.find(params[:id])
    @new_comment = @article.comments.build
  end
  ....
end

然后做一个形式为它的文章的观点:

<% form_for @new_comment do |f| %>
   <%= f.text_area :text %>
   <%= f.submit "Post Comment" %>
<% end %>

默认情况下,此评论会去create的行动CommentsController ,你会那么很可能希望把redirect :back成这样你路由回Article页面。



文章来源: form_for with nested resources