これを処理するために私が見つけた最良の方法は、RailsCast 237からのものです。Arrel の回答よりも詳細ですが、attr_accessible にロール (または他のフィールド) を追加する必要はありません。
次のメソッドをイニシャライザに追加します。
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible
private
def mass_assignment_authorizer(role = :default)
if accessible == :all
self.class.protected_attributes # hack
else
# super returns a whitelist object
super + (accessible || [])
end
end
end
次に、コントローラーで次のことができます。
user.accessible = :role できる場合は? :set_role、リソース
残念ながら、この呼び出しは、ユーザー (またはその他の) オブジェクトがインスタンス化された後に行う必要があります。つまり、コントローラーをサブクラス化し、更新と作成でリソースをインスタンス化した後にこれを呼び出す必要があります。
これは Rails 3.2 用です。以前のバージョンでは、メソッド mass_assignment_authorizer はパラメーターを取らないと思います。値のない attr_accessible は、一括割り当てに対するフェイルセーフ アプリケーション全体の拒否を設定します。これは、application.rb ファイルでも実行できます。
config.active_record.whitelist_attributes = true