嵌套表单,“无法批量分配受保护的属性”

时间:2012-07-04 11:35:27

标签: ruby-on-rails forms nested-forms mass-assignment

这是我嵌套表单的相关部分:

<div class="field">
<%= f.fields_for "@partcode" do |p|%> 

  <%= p.label "partcode"%><br />
  <%= p.text_field :partcode %>

<% end %>
</div>

我的模特已经有了这个:

attr_accessible :partcode,
                :description

但是当我在表单中输入内容时,我收到此错误:

Can't mass-assign protected attributes: @partcode

这是我的零件代码模型:

class Partcode < ActiveRecord::Base
 attr_accessible :partcode,
              :description

  validates       :partcode,
              :description,
              :presence => true

 belongs_to "goods_ins"

 accepts_nested_attributes_for "goods_ins"


end

以下是我在商品中的所有代码:

class GoodsIn < ActiveRecord::Base
  attr_accessible :c4lpono, 
              :courier, 
              :deliverydate,  
              :deliverynoteno,  
              :description,  
              :destination,  
              :notes,  
              :partcode,  
              :quantity,  
              :signedby,  
              :suppliername

  validates       :deliverydate,  
              :deliverynoteno,  

              :destination,

              :quantity,  
              :signedby,  
              :suppliername,
              :presence => true

 has_many :suppliers

 has_many :partcodes

 accepts_nested_attributes_for :partcodes
end

此处还有我的零件代码控制器的new部分:

def new
@partcode = Partcode.new

respond_to do |format|
  format.html # new.html.erb
  format.json { render :json => @partcode }
end
end 

4 个答案:

答案 0 :(得分:7)

你不应该:attr_accessible的粒子属性(在商品模型中),如下所示:

attr_accessible :partcode_attributes

假设您的模型关联是这样配置的。希望它有所帮助

答案 1 :(得分:0)

我想看看你的模特。但attr_accessible不是一个实例。我认为应该说这个

<%= f.fields_for "partcode" do |p|%>` 

比你的控制器:

@partcode = Partcode.new(params["partcode"])

答案 2 :(得分:0)

查看您的回答中的评论我相信您可以使用build方法为has_one续签:

@partcode = GoodsIn.build_partcode

所以你的表格可以是这样的:

<%= f.fields_for @partcode do |p|%> 

答案 3 :(得分:0)

您的模型必须有accepts_nested_attributes_for :partcode,否则它将不接受它的属性。

Partcode类也必须将其属性列为白色。

<强>更新

@partcode必须包含新的Partcode。确保设置@partcode = @goods_in.partcodes.build或简单@partcode = Partcode.new

表单上的字段应该像<%= f.fields_for @partcode do |p| %>一样,没有引号。