rails嵌套属性

时间:2012-02-13 03:48:21

标签: ruby-on-rails formtastic nested-attributes

我想在博客条目的底部创建一个评论表单。问题是它没有保存blog_id所以在创建注释时,它没有被分配blog_id。我想通过这条线:

@new_comment = @blog.comments.build(params[:comment])

它会起作用,但它没有。这就是我所拥有的:

博客#节目

def show
 @blog = Blog.find(params[:id])
 @new_comment = @blog.comments.build(params[:comment])
end

博客#形式

...
<%= semantic_form_for @new_comment do |f| %>
  <%= f.input :name %>
  <%= f.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %>
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div>
<% end %>

blog.rb

 accepts_nested_attributes_for :comments

评论控制器

  def create
@comment = @blog.comments.build(params[:comment])
if @comment.save
  redirect_back_or show_blog_path(@blog)
else
  redirect_to show_blog_path(@blog)
end
end

修改

我通过执行以下操作将表单嵌套在@blog中:

<%= semantic_form_for @blog do |f| %>
<%= f.semantic_fields_for :comments do |ff| %>
  <%= ff.input :name %>
   <%= ff.input :content, :label => "Comment", :input_html => { :rows => 6, :class => "xxlarge" } %>
<% end %>    
<div class="pull-right"><%= f.commit_button :button_html => {:class => "primary"}, :label => "Submit" %></div>
<% end %>

并将博客#show改为:

@blog = Blog.find(params[:id])
@blog.comments.build
@comments = Comment.where(:blog_id => @blog.id)

一切正常,但现在提交评论后,评论会显示两次。它显示在评论部分中应该显示的位置,并且它还显示为新评论表单上的预填充评论表单。因此,您可以看到博客的内容,我刚刚提交的预先填写的评论表单,新的评论表单以及显示评论部分中的评论。

我不知道那是什么。

1 个答案:

答案 0 :(得分:1)

您没有在表单中引用父对象。是的,您已初始化引用当前@new_comment的{​​{1}},但评论表单未指定此内容。如果你检查传递的params来创建注释控制器的动作,你最有可能找不到传递@blog

尝试

bold_id

在评论表中。

或者,如果您不希望隐藏字段,那么您可以使用嵌套表单

f.hidden :blog 

但是,这需要你的路由文件有注释的路径嵌套在博客下,某些东西(现在只允许创建动作)

semantic_form_for [@blog, @new_comment] do |f|

这是必需的,因为表单的帖子是针对blog_comments_path。

希望这有帮助。

编辑:这就是我建议实施的方法(ymmv,所以,如果它满足您的需求,请说清楚) -

resources :blogs do resources :comments, :only => [:create] end as:

blogs#show

表格如下:

@blog = Blog.find(params[:id])
@now_comment = @blog.comments.build 
@comments = @blog.comments # existing comments u might wanna show below the post

路线 - 如上所示嵌套

= semantic_form_for [@blog, @new_comment] do |f| # input for name and content as :( blog_id也作为params传递。所以,你可以找到博客并根据该博客的评论参数建立评论,然后保存)

comments#create