これを処理する最も良い方法は、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:役割をできるかどうか? :set_role、resource
この呼び出しは、残念ながら、ユーザー(または何か)オブジェクトがインスタンス化された後に行わなければなりません。つまり、コントローラをサブクラス化して、updateとcreateでリソースのインスタンス化の後に呼び出す必要があります。
これはRails 3.2用です。以前のバージョンでは、メソッドmass_assignment_authorizerはパラメータを取らないと考えています。値のないattr_accessibleは、質量割り当てのフェイルセーフアプリケーションのワイド拒否を設定します。これは、application.rbファイルでも行うことができます。
config.active_record.whitelist_attributes = true