0

すでに投稿されているこの質問と同様の状況があります。コラクターが尋ねた

私は、2 つの ActiveRecords User と Role ユーザーと Role が互いに HABTM 関係にあるユーザー認証に単純なモデルを使用しています。. . @user.roles または @user.role_ids を使用してロールを手動で割り当てることはできますが、User#new または User#update_attributes 内の「魔法」は機能しません。

オレグはそれを提案した

attr_accessible :role_ids

ユーザーモデルに追加されます。これにより、一括割り当てオペレーターがロールを更新できるようになります。ただし、セキュリティ上の懸念から、このアプローチを使用しないように警告しました。

オレグの回答に対するフォローアップの質問があります -

この状況で、一括割り当てを使用せずに役割を更新するための推奨される方法はありますか?

また、仮定すると

  1. ユーザーを認証し、
  2. users_controller に before_filter を入れることで、管理者のみがユーザーを CRUD できるようにします。

role_ids の大量割り当てはまだ有効な懸念事項ですか?

4

1 に答える 1

2

一括代入は 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_idsrole_ids別の方法は、のように明示的に割り当てることです.role_ids = params[:user][:role_ids]。ユーザーに role_id を編集させたくない別のフォームがある場合は、これを使用する必要があります。

于 2011-03-20T19:20:28.030 に答える