使用accepts_nested_attributes_for,has_many并只创建一个条目

时间:2012-04-04 20:06:00

标签: ruby-on-rails associations

我有一个包含很多评论的页面。许多用户可以访问此页面并提交评论。我查看另一个私有页面的评论。

模型/ page.rb

class Page < ActiveRecord::Base
  has_many :comments, :dependent => :destroy 
  accepts_nested_attributes_for :comments, :allow_destroy => true
end

模型/ comment.rb

class Comment < ActiveRecord::Base
  belongs_to :page
  belongs_to :user
end

views / pages / show.html.erb相关部分

<%= form_for @page, :remote => true do |f| %>
    <% f.fields_for :comments do |builder| %>
   <%= builder.text_area :content, :rows => 1 %>
   <%= builder.submit "Submit" %>
    <% end %>
<% end %>

控制器/ pages_controller.rb

def show
  @page = Page.find(params[:id])
end

def update
  @page = Page.find(params[:id])
  @page.comments.build
  @page.update_attributes(params[:page])
end

这里的问题是我不希望让用户看到多个注释字段。然而,如果我做<% f.fields_for :comment do |builder| %>那么它会抛出一个错误,因为它不知道一条评论是什么,只想处理多个。

基本上,用户应该能够在页面上提交单个注释,该注释具有许多注释,并且具有与页面自动关联的注释。作为次要的事情,我需要拥有与评论相关联的用户ID(可通过Devise访问current_user.id)。

2 个答案:

答案 0 :(得分:9)

<% f.fields_for :comments, f.object.comments.build do |fc| %>
  <!-- rest of form -->
<% end %>

答案 1 :(得分:0)

你能使用嵌套资源吗?基本上在routes.rb ...

resources :pages do 
  resources :comments 
end     

然后在评论控制器中,您可以通过page_id找到页面 或类似的东西..不要回想起头顶的确切语法..