无法批量分配受保护的属性

Posted

技术标签:

【中文标题】无法批量分配受保护的属性【英文标题】:Can't mass-assign protected attributes 【发布时间】:2011-09-04 01:26:19 【问题描述】:

更新代码格式以便更好地查看。

伙计们,

我一直在看这个,但我不明白这里可能会出现什么问题。我正在使用设计。

class User < ActiveRecord::Base
  has_many :addresses
  accepts_nested_attributes_for :addresses

  # Other stuff here
end

class Address < ActiveRecord::Base

  belongs_to :user

  validates_presence_of :zip #:street_address1, 

结束

-------- 日志输出开始------------ ------

在 127.0.0.1 开始 POST "/users" 2011-05-28 11:43:27 -0700 处理 通过 RegistrationsController#create as html 参数:"utf8"=>"√", "authenticity_token"=>"CEmdqlsmdYa6Jq0iIf5KAxxISsUCREIrFNXWkP80nhk=", "用户"=>"电子邮件"=>"a2@gmail.com", "密码"=>"[过滤器]", "addresses_attributes"=>"0"=>"street_address1"=>"234 Pitkin Ct.", "zip"=>"12456", “提交”=>“注册” 警告:不能 批量分配受保护的属性: 地址_属性 SQL (0.0ms) BEGIN SQL (164.0ms) 显示表 用户负载 (0.0ms) SELECT users.id 来自users 哪里(users.email = BINARY 'a2@gmail.com') 限制 1 个 SQL (1.0ms) 回滚

-------- 日志输出结束------------ ------

发布的数据中存在 zip,并且发布的数据似乎格式正确。在网页表单上,我收到“地址 zip 不能为空白”的错误。我已经研究了导致“无法批量分配受保护属性”警告的原因,但没有找到任何对我有帮助的东西。

感谢您的想法和指点。

-S

【问题讨论】:

【参考方案1】:

SpecificModel 内部(appfolder/app/model/specific_model.rb

尝试使用

attr_accessible :addresses_attributes, :another_attribute_to_make_mass_assignable, :another_attribute, etc.

【讨论】:

试过 attr_accessible :street_address1, :zip, :address_attributes 但得到同样的错误。【参考方案2】:

只需在模型中包含 数据字段,如下所述

attr_accessible :addresses_attributes

【讨论】:

【参考方案3】:

现在(2013 年 4 月)您应该开始使用 https://github.com/rails/strong_parameters

【讨论】:

【参考方案4】:

看看这里并学习:)

http://railscasts.com/episodes/26-hackers-love-mass-assignment


编辑:

拥有accepts_nested_attributes_forin User 模型使您能够将数据发送到 Address 模型。

然后,在地址模型中,你必须设置请求的attr_accessible

【讨论】:

感谢@apneadiving 的反馈。我浏览了 railscasts 剧集,它证实了我对 attr_accessible 的理解。我在我的地址模型中打开它(通过取出 attr_accessible),所以我不会有任何问题。我将它添加回“attr_accessible :street_address1, :zip, :address_attributes”,但仍然出现相同的错误。我过去曾这样做过,并且从未在 :nestedclass_attributes 上声明 attr_accessible - 我想知道设计以某种方式在导致此问题的背面做了一些事情。 尝试了“attr_accessible :address_attributes”和“attr_accessible :addresses_attributes” 在您的用户模型中:attr_accessible : addresses_attributes,在您的地址模型中:attr_accessible :zip, :street_address_1 确实,Devise 在您的 User 模型中设置了一些 attr_acessible,您必须保留它们并添加您需要的其他。 感谢@apneadiving。我将“attr_accessible:addresses_attributes”添加到用户模型而不是我添加的地址模型,这似乎有效!

以上是关于无法批量分配受保护的属性的主要内容,如果未能解决你的问题,请参考以下文章

无法批量分配受保护的属性

“警告:无法批量分配受保护的属性”

嵌套表单触发“无法批量分配受保护的属性”警告

ActiveAdmin:无法批量分配受保护的属性:电子邮件、密码、密码确认

无法使用 Devise 批量分配受保护的属性以创建 has_many 嵌套模型

尝试将 Jcrop 添加到 Paperclip 时无法批量分配虚拟属性