次のコードを実行しようとすると、
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
また、Railsが混乱し、単一テーブル継承(STI)を使用したいと考えているため、列名type
の使用に問題がある場合は、答えを確認してくださいそれを回避する方法を確認するには、この質問に: http://guides.rubyonrails.org/
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
...そして、学習を続けるのは良いことです。最初の製品アプリケーションをコーディングするときは、これを有効にしておくことを忘れないでください:)
試してください:オープンconfig/application.rb
config.active_record.whitelist_attributes = true
の行を探します
Trueをfalseに変更します
その後、あなたは元気です。
PS:Railsコンソールを再起動することを忘れないでください。
次のような別のエラーが発生するはずです。列 'type'は、継承の場合にクラスを格納するために予約されています。列 'type'はアクティブなレコードデータベースでは使用しないでください。
私は使わない whitelist_attributes
大量割り当てを許可したい場合のユースケースは内部ロジック用であり、通常は直接CRUDアクション用のコントローラーにありません。そのような場合は、強力なパラメータを使用することをお勧めします。しかし、特定のモデルの一括割り当てを有効にしたい場合は、
class Foo < ActiveRecord::Base
# disables mass-assigment
attr_protected
end
これは基本的にattr_protected
空の配列([])
ここ は、Railsでの一括割り当てとは何か、および保護が設定されている理由についての情報です。実際に保護された属性ですが、2、3行余分にかかります。
hassle = rota.hassles.build(:sender => user1, :receiver => user2)
hassle.type = 'sms'
hassle.save