2012-02-13 902 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