我想在博客条目的底部创建评论表单。问题在于,在评论创建时它不保存blog_id,因此未分配blog_id。我以为有这条线:rails嵌套属性
@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 %>
,改变了博客#展现给:
@blog = Blog.find(params[:id])
@blog.comments.build
@comments = Comment.where(:blog_id => @blog.id)
一切工作正常,但现在经过我提交评论,评论显示两次。它显示在它应该在的评论部分,并且它也显示为新的评论表单上的预先填充的评论表单。因此,您可以看到博客的内容,我刚刚提交的预填充评论表单,新评论表单以及显示评论部分中的评论。
我不知道它是什么。
我不想添加隐藏字段。我按照习惯的方式嵌套了表单。 (不知道我做这件事的方式和你做事的方式有什么不同)。但看到我的编辑上面的新问题。谢谢。 – noob 2012-02-13 05:50:43
预先填充的评论表单归因于@comments变量。 'semantic_fields_for'本质上是对所有评论(即博客的现有评论和由@ blog.comments.build行实例化的新评论)进行循环并在表单中显示每个评论。 – prasvin 2012-02-13 07:55:56
p.s. :上述(编辑后)是否正常工作?该表单具有semantic_form_for“@ blog”,并且它接受每个评论的嵌套属性,现在提交的表单如何创建评论控制器的操作。该表单现在充当'@ blog'的编辑表单,因此提交更新博客控制器的操作。 这就是创建评论的地方(或者由于它接受它们的嵌套属性,因此正在更新博客从而创建评论)。 – prasvin 2012-02-13 08:04:12