我想在博客条目的底部创建一个评论表单。问题是它没有保存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)
一切正常,但现在提交评论后,评论会显示两次。它显示在评论部分中应该显示的位置,并且它还显示为新评论表单上的预填充评论表单。因此,您可以看到博客的内容,我刚刚提交的预先填写的评论表单,新的评论表单以及显示评论部分中的评论。
我不知道那是什么。
答案 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