ruby-on-rails - ActiveModel::MassAssignmentSecurity::Error: 无法批量分配 protected 属性

标签 ruby-on-rails activemodel

如果我尝试执行以下代码:

hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")

我得到以下错误:
Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
 ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: type

我不确定这意味着什么。我已将 :type 设为强制,所以如果我删除它,我会收到一个 sql 错误。

最佳答案

一些事情:

批量分配通常意味着将属性传递到创建对象的调用中,作为属性散列的一部分。也就是说,您将散列中的一堆属性传递到创建新对象的调用中。例如:

@user = User.create({:name => "My name", :user_type => "nice_user"})

但是,Rails 包含一些基本的安全规则,这意味着默认情况下并非所有属性都可以通过这种方式分配。您必须事先指定哪些可以。你这样做:
class User < ActiveRecord::Base
  attr_accessible :name, :user_type
end

如果不指定属性是 attr_accessible ,然后将其传入以创建对象,则会收到您发布的错误。

以下是更多详细信息:

http://api.rubyonrails.org/v3.2.9/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

另一种方法是在您第一次创建记录时设置一些属性,然后设置其他属性——像这样:
# In this example `user_type` is not attr_accessible so it needs to be set specifically
@user = User.create({:name => "My name"})
@user.user_type = "nice_user"
@user.save

此外,如果您在使用列名 type 时遇到问题由于 rails 感到困惑并认为您想使用单表继承 (STI),请查看此问题的答案以了解如何解决此问题:http://guides.rubyonrails.org/

关于ruby-on-rails - ActiveModel::MassAssignmentSecurity::Error: 无法批量分配 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574957/

相关文章:

ruby-on-rails - dependent => 销毁 "has_many through"关联

ruby-on-rails - 似乎无法创建具有特定 Rails 版本的应用程序 [Hartl 的教程]

ruby-on-rails - Rails 模型中是否可以自动返回虚拟属性?

ruby-on-rails - ActiveModel 验证自定义 setter

ruby-on-rails - rails 3 : Where to store shared methods for models?

ruby-on-rails - 未找到 Ruby Bundle 符号 : _SSLv2_client_method (LoadError)

javascript - React Router 服务器端渲染 Rails

ruby-on-rails - Carrierwave Direct gem 上传成功后没有重定向?

validation - 导轨 3 : Custom error message in validation

ruby-on-rails - 如何在 Rails 模型的回调中访问参数?