web-dev-qa-db-ja.com

ActiveModel :: MassAssignmentSecurity :: Error:保護された属性を一括割り当てできません

次のコードを実行しようとすると、

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エラーが発生します。

26
Karan

いくつかのこと:

一括割り当てとは通常、属性ハッシュの一部としてオブジェクトを作成する呼び出しに属性を渡すことを意味します。つまり、ハッシュ内の一連の属性を、新しいオブジェクトを作成する呼び出しに渡します。例えば:

@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

また、Railsが混乱し、単一テーブル継承(STI)を使用したいと考えているため、列名typeの使用に問題がある場合は、答えを確認してくださいそれを回避する方法を確認するには、この質問に: http://guides.rubyonrails.org/

63
Kevin Bedell

Pragmatic Programmer's "Agile Web Development with Rails" 4th editionなどの3.1チュートリアルに従って、Rails 3.2を使用していますか?次に、 http://guides.rubyonrails.org /3_2_release_notes.html

問題は、Rails 3.1から3.2まで、Active Recordモデルの大量割り当て保護のチェックがデフォルトで「strict」に設定されていることです。これらのファイルの適切な行をコメント化してください:

config/environments/development.rb
config/environments/test.rb

...そして、学習を続けるのは良いことです。最初の製品アプリケーションをコーディングするときは、これを有効にしておくことを忘れないでください:)

7
LANerd
  1. 試してください:オープンconfig/application.rb

  2. config.active_record.whitelist_attributes = trueの行を探します

  3. Trueをfalseに変更します

その後、あなたは元気です。

PS:Railsコンソールを再起動することを忘れないでください。

5
Mr. Pei

次のような別のエラーが発生するはずです。列 'type'は、継承の場合にクラスを格納するために予約されています。列 'type'はアクティブなレコードデータベースでは使用しないでください。

2

私は使わない whitelist_attributes大量割り当てを許可したい場合のユースケースは内部ロジック用であり、通常は直接CRUDアクション用のコントローラーにありません。そのような場合は、強力なパラメータを使用することをお勧めします。しかし、特定のモデルの一括割り当てを有効にしたい場合は、

class Foo < ActiveRecord::Base
  # disables mass-assigment
  attr_protected
end

これは基本的にattr_protected空の配列([])

1
Haris Krajina

ここ は、Railsでの一括割り当てとは何か、および保護が設定されている理由についての情報です。実際に保護された属性ですが、2、3行余分にかかります。

hassle = rota.hassles.build(:sender => user1, :receiver => user2)
hassle.type = 'sms'
hassle.save
0
x1a4