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

tib*_*bon 4 ruby-on-rails associations

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

车型/ page.rb

class Page < ActiveRecord::Base
  has_many :comments, :dependent => :destroy 
  accepts_nested_attributes_for :comments, :allow_destroy => true
end
Run Code Online (Sandbox Code Playgroud)

车型/ comment.rb

class Comment < ActiveRecord::Base
  belongs_to :page
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

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 %>
Run Code Online (Sandbox Code Playgroud)

控制器/ 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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 9

<% f.fields_for :comments, f.object.comments.build do |fc| %>
  <!-- rest of form -->
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 我同意Alex Bartlow的评论.以下是相关的api文档:http://apidock.com/rails/v3.1.0/ActionView/Helpers/FormHelper/fields_for在该页面中搜索"也可以指定要使用的实例",你会看到它的代码示例.另外,要将user_id添加到注释表单中,请使用hidden_​​field_tag:`fc.hidden_​​field:user_id,current_user.id`.以下是文档:http://apidock.com/rails/ActionView/Helpers/FormHelper/hidden_​​field (2认同)