2012-01-15 5 views
0

Railscast tutorialは、"admin"として私のUserモデルのrole属性を編集するための質量割り当てをバイパスしています。ユーザーの更新中に一括割り当てを迂回すると、NameError?

class User < ActiveRecord::Base 
    attr_accessible :email, :password, :remember_me 
    attr_accessor :accessible 
    devise :database_authenticatable, ....etc 
    before_create :setup_default_role_for_new_users 

    ROLES = %w[admin default banned] 

    private 

    def setup_default_role_for_new_users 
    if self.role.blank? 
     self.role = "default" 
    end 
    end 

    def mass_assignment_authorizer 
    super + (accessible || []) 
    end 
end 

そして、私は新しいUsersControllerは私の更新方法に問題があるために作成した:私はこのラインbecuaseこのかかわらを行うことはできません

def update 
    @user = User.find(params[:id]) 
    @user.accessible = [:role] if user.role == "admin" 
    if @user.update_attributes(params[:user]) 
     redirect_to @user, :notice => "Successfully updated user." 
    else 
     render :action => 'edit' 
    end 
end 

if user.role == "admin"これは私が私の役割を定義した方法です問題を引き起こしてエラーが発生しました:

NameError (undefined local variable or method `user' for UsersController 

ここでは何が欠けていますか?

ありがとうございます。

+3

「@ user.role == "admin" 'ならば? –

+0

@ KL-7私はそれを試みましたが、 'role'を更新しませんでした。もし私が 'if'というステートメントを持っていなくても、それはロールを更新します。 – LearningRoR

答えて

1

userの部分がuser.role == "admin"の場合、updateメソッドで定義されていないローカル変数を使用しようとしています。 userがコントローラでアクセス可能なヘルパーメソッドとして宣言されていない場合、rubyはそれを見つけられません。

あなたのコードからは、管理ユーザーだけが別のユーザーの役割を更新できると仮定していますか?したがって@user.role == "admin"ではなくuser.role == "admin"を使用していますか?

もしそうなら、ヘルパーメソッド(つまり、ApplicationHelperクラス)を使用するか、更新メソッドで使用する前にフェッチするか、コントローラのbefore_ *コールバックを使用してuserオブジェクトを提供する必要があります。

私の意図がはっきりしていることを願っています。

+0

はい、あなたは正しいです。 '@ user.role'を実行してもロールを変更しないので、ヘルパーメソッドにする必要があります。それをヘルパーでどのように定義するのですか? – LearningRoR

+0

さて、ヘルパーメソッドの名前を 'current_user'に変更することをお勧めします。また、ApplicationHelperクラスでは、あなたのアプリケーション設定に依存するあなたの現在のユーザーであるユーザーオブジェクトを返すだけです。どのような種類の認証/承認を使用しますか?あなたはそれに宝石/プラグインを使用していますか、あなた自身のロジックを書いていますか? – Vapire

+0

私は 'Devise'を使用しています – LearningRoR

関連する問題