【问题标题】:Nested Form, "Can't mass-assign protected attributes"嵌套表单,“无法批量分配受保护的属性”
【发布时间】:2012-07-04 21:54:00
【问题描述】:

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

<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 

【问题讨论】:

  • 你有没有试过松开@partcode周围的“”?
  • 是的,然后它想出了:NilClass:Class的未定义方法`model_name'
  • 那么你还没有在你的控制器中实例化@partcode。尝试在控制器操作中编写:@partcode = Partcode.new(或任何类)。
  • 这已经在我的控制器中了..我忘了更深入地解释一下,该表格用于名为goods_in的表,但这个嵌套部分用于名为partcode的表..
  • Ok..GoodsIn 模型的类定义中有以下声明? accepts_nested_attributes_for :partcode。这也是一对一的关系还是一对多的关系?

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


【解决方案1】:

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

另外Partcode 类也必须将他的属性列入白名单。

更新:

@partcode 中必须有一个新的Partcode。确保设置@partcode = @goods_in.partcodes.build 或简单的@partcode = Partcode.new

表单上的字段应该是这样的&lt;%= f.fields_for @partcode do |p| %&gt;,也没有引号。

【讨论】:

  • 请查看我更新后的答案以及我在两个模型中的代码:)
  • @CarlaDessi 在@partcode 变量中插入了什么?
  • 嗯.. 在表单的文本字段中输入了什么?对不起,如果这不是你的意思..
  • @CarlaDessi 类似乎设置正确,因此错误似乎来自@partcode 实例变量中的内容。请发布设置@partcode的控制器代码,它可能没有被GoodsIn.partcodes.build初始化
  • 我的部分代码控制器有很多,但我猜你需要这个位:@partcode = GoodsIn.build_partcode def partcode @partcode = Partcode.all respond_to do |format| format.html # index.html.erb format.json { render :json =&gt; @partcode }
【解决方案2】:

您是否应该有 :partcode_attributes to attr_accessible(在 GoodsIn 模型中),像这样:

attr_accessible :partcode_attributes

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

【讨论】:

  • 在里面添加了这个,我仍然收到undefined method 'partcodes' for #&lt;Class:0x7f3e3c29b4a0&gt;
【解决方案3】:

从您的回答中查看 cmets,我相信您可以使用为 has_one relanshionships 制作的 build 方法:

@partcode = GoodsIn.build_partcode

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

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

【讨论】:

  • 试过了,我得到了undefined method 'model_name' for NilClass:Class
【解决方案4】:

我想看看你的模型。但 attr_accessible 不是一个实例。我觉得应该就这么说吧

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

比在你的控制器中:

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

【讨论】:

  • 试过了,我明白了:undefined local variable or method 'params' for GoodsInsController:Class
  • 啊,好吧,在 def create 之后立即添加一个调试器。提交后返回什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多