26

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

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

4

7 に答える 7

66

いくつかのこと:

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

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

ただし、Rails にはいくつかの基本的なセキュリティ ルールが含まれており、デフォルトですべての属性をそのように割り当てることができるわけではありません。どちらができるかを事前に指定する必要があります。次のようにします。

class User < ActiveRecord::Base
  attr_accessible :name, :user_type
end

属性 is を指定せず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

さらに、typeRails が混乱し、Single Table Inheritance (STI) を使用したいと考えているために列名の使用に問題がある場合は、この質問への回答を確認して回避する方法を確認してください: http:// guides.rubyonrails.org/

于 2012-05-13T20:38:21.920 に答える
2

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

于 2013-12-11T03:58:10.163 に答える
0

ここでは、Rails での一括代入とは何か、および保護が実施されている理由について、いくつかの情報を示します。保護された属性を本当に割り当てたい場合は、非常に簡単に回避できますが、余分な行が数行必要になります。

hassle = rota.hassles.build(:sender => user1, :receiver => user2)
hassle.type = 'sms'
hassle.save
于 2012-05-13T20:31:03.790 に答える