一括代入は Rails の機能で、このようなモデルを更新するためのコードを少なくするために提供されています
Model.create(params[:model])
@model.update_parameters(params[:model])
それ以外の
@model.field1 = params[:model][:field1]
@model.field2 = params[:model][:field2]
...
@model.save
しかし、この機能には、意図しない値の更新のリスクが伴います。たとえば、field1、field2、および field3 だけをユーザーに更新させたい場合に一括割り当てに使用すると、 field4が url から、またはその他の方法でupdate_parameters
渡された場合、field4 が更新されるリスクがあります。model[user][field4]=some_value
コードでフィールドを明示的に割り当てている場合、このリスクはありません。ただし、各フィールド (更新または作成する場所) の値を設定する必要があり、あまり生産的ではありません。
したがって、一括割り当て機能を使用するには、2 つのオプションがあります。最初はattr_protected
attr_protected :field4
これにより、field4 が含まれている場合でも、params[:model] からの一括代入から field4 が保存されなくなります。field4 を保存するには、code( @model.field4 =
) で field4 のセッターを明示的に呼び出す必要があります。しかし、問題attr_protected
は、Rails が一括代入のために知らない他の属性を提供する可能性があることです。たとえば、次のように定義すると
has_many :model2s
Model.rb では、Rails がmodel2_ids=
自動的にメソッドを提供し、これに一括代入でアクセスできます ( model[model2_ids]=
URL を指定すると、まったく意図されていない関連付けが作成されます)。そのため、使用中にこのような属性が欠落する可能性がありますattr_protected
。
したがって、推奨される方法は、attr_accessible
attr_accessible :field1, :field2, :field3
これにより、これらのフィールドが一括割り当て用に開かれ、モデル内の他のすべての属性が一括割り当て用に使用できなくなります。したがって、推奨される方法は、ユーザーが編集できるようにフォームで提供している属性を作成し、attr_accessible
他のすべてのパラメーターを保護することです。ただし、これを使用している間は、編集に必要なすべての属性が含まれていることを確認する必要がありますattr_accessible
。
あなたの場合、ユーザーに を編集してもらい、role_ids
管理者ユーザーのみに CRUD へのアクセスを提供しているので、 を使用できると思いますattr_accessible :role_ids
。role_ids
別の方法は、のように明示的に割り当てることです.role_ids = params[:user][:role_ids]
。ユーザーに role_id を編集させたくない別のフォームがある場合は、これを使用する必要があります。