2011-01-31 9 views
1

私のレール3アプリに権限を追加しようとしています。 それ以外にも、私も、thisのチュートリアルに従って、adminユーザーのためにattr_accessibleを動的に設定しようとしています(私は定期的なユーザーの役割を変更したいが、管理者はそうすることができます)...問題は、 railscastチュートリアルのアプローチでは、コントローラの動作を変更するためのアクセス権があると仮定しています。Rails Dev Attr_accessible problem

あなたが考案コントローラのサブクラスを作成することができます

答えて

1

を助けてください、あなただけのビューを生成し、正しい場所に移動する必要があります。 Devise readmeの「ビューの設定」と「コントローラの設定」を確認してください。

私はattr_accessibleにrole_idsを追加し、次にRegistrationsControllerをサブクラス化し、before_filterを追加して非管理者用のparamを削除しました。

class Users::RegistrationsController < Devise::RegistrationsController 
    before_filter :remove_admin_params, :only => [:create, :update] 

protected 
    # disable setting the role_ids value unless an admin is doing the edit. 
    def remove_admin_params 
    params[:user].delete(:role_ids) unless current_user.try(:admin?) 
    end 
end 

登録ビューを/app/views/users/registrations/に追加してください。

0

これを処理する最も良い方法は、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