ActiveModel :: MassAssignmentSecurity ::错误:无法批量分配受保护的属性

Kar*_*ran 26 ruby-on-rails activemodel

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

hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
Run Code Online (Sandbox Code Playgroud)

我听到以下错误:

Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
 ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: type
Run Code Online (Sandbox Code Playgroud)

我不确定这意味着什么.我已经使:type是必须的,所以如果我删除它,我得到一个SQL错误.

Kev*_*ell 64

几件事:

质量赋值通常意味着将属性传递给调用,该调用将对象创建为属性哈希的一部分.也就是说,您将哈希中的一堆属性传递给创建新对象的调用.例如:

@user = User.create({:name => "My name", :user_type => "nice_user"})
Run Code Online (Sandbox Code Playgroud)

但是,Rails包含一些基本的安全规则,这意味着默认情况下不能以这种方式分配所有属性.您必须事先指定哪些可以.你这样做:

class User < ActiveRecord::Base
  attr_accessible :name, :user_type
end
Run Code Online (Sandbox Code Playgroud)

如果您未指定属性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
Run Code Online (Sandbox Code Playgroud)

此外,如果您在使用的列名的问题type,因为Rails是感到困惑,认为你想使用单表继承(STI),检查这个问题的答案,看看如何解决它:HTTP:// guides.rubyonrails.org/


小智 7

您是否正在使用Rails 3.2,同时遵循3.1教程,例如Pragmatic Programmer的"使用Rails进行敏捷Web开发"第4版?然后查看http://guides.rubyonrails.org/3_2_release_notes.html.

您的问题是从Rails 3.1到3.2,默认情况下,Active Record模型的质量分配保护检查设置为"严格".注释掉这些文件中的相应行:

config/environments/development.rb
config/environments/test.rb
Run Code Online (Sandbox Code Playgroud)

......你很高兴继续学习.在编写第一个生产应用程序时,请记住保持这种效果:)


Mr.*_*Pei 5

  1. 请尝试:打开 config/application.rb

  2. 找到行的 config.active_record.whitelist_attributes = true

  3. 将true更改为false

那你就没事了.

PS:记得重新启动rails控制台.