2012-02-13 152 views
1

我想在博客条目的底部创建评论表单。问题在于,在评论创建时它不保存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) 

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

我不知道它是什么。

回答

1

您没有在表单中引用父对象。是的,您已初始化@new_comment,其中引用了当前的@blog,但评论表单未指定此内容。如果您检查传递的参数以创建评论控制器的操作,则很可能找不到bold_id正在通过。

尝试在评论表单做

f.hidden :blog 

或者,如果你不希望有一个隐藏字段这样,那么你可以有一个嵌套形式

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

但是,这需要你的路由文件有路径的下嵌套评论博客,作为东西(让我们现在只创建操作)

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

以此为形式的职位是针对blog_comments_path是必需的。

希望这会有所帮助。

编辑:这是我的建议实施它(因人而异,所以,请大家清楚,如果它满足您的需求) -

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 

路由 - 嵌套如上所示

comments#create as:(blog_id也作为params传递。所以,你可以找到博客,并根据该博客的评论参数建立评论,然后保存它)

@blog = Blog.find(params[:blog_id]) 
@comment = @blog.comments.new(params[:comment]) 
@comment.save 
+0

我不想添加隐藏字段。我按照习惯的方式嵌套了表单。 (不知道我做这件事的方式和你做事的方式有什么不同)。但看到我的编辑上面的新问题。谢谢。 – noob 2012-02-13 05:50:43

+0

预先填充的评论表单归因于@comments变量。 'semantic_fields_for'本质上是对所有评论(即博客的现有评论和由@ blog.comments.build行实例化的新评论)进行循环并在表单中显示每个评论。 – prasvin 2012-02-13 07:55:56

+0

p.s. :上述(编辑后)是否正常工作?该表单具有semantic_form_for“@ blog”,并且它接受每个评论的嵌套属性,现在提交的表单如何创建评论控制器的操作。该表单现在充当'@ blog'的编辑表单,因此提交更新博客控制器的操作。 这就是创建评论的地方(或者由于它接受它们的嵌套属性,因此正在更新博客从而创建评论)。 – prasvin 2012-02-13 08:04:12