0

私はこのヘルパーメソッドを書きました:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  private

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user
end

私の考えでは、できるはずですcurrent_user.role == 'some role'が、それを行うと、「nil:NilClassの未定義のメソッドロール」と言って飛び散ります。これは、ロール列が空で何もないこと、またはユーザーオブジェクト空ですか?私はログインしていることを保証するため、私はデータベースに存在し、....データベースの役割フィールドは空です。

更新私はおそらくUser.role == 'admin'、データベースのロール属性、または列の役割であるため、うまくいくと述べるべきです。current_user で .role を実行できないのはなぜですか?

4

1 に答える 1

0

このエラーに基づいて、current_user が値 nil を返していることを確認できます。したがって、問題はメソッドの役割ではありません。User.role は User モデルのクラス メソッドであるため、特定のユーザーのメソッドを呼び出しているわけではないことに注意してください。一方、 current_user.role は、サインインしている特定のユーザーのインスタンス メソッドです。

エラーをスローしているメソッドのすぐ上に次を配置します。

raise session[:user_id].inspect

上記のメソッドを使用して適切な user_id がセッション cookie にあることを確認した後、 current_user ヘルパー メソッドの最後に以下を追加して、ユーザーが実際に返されていることを確認することもできます。

raise @current_user.inspect 

session[:user_id] を作成するために使用しているロジックは何ですか? また、ブラウザのキャッシュをクリアするか、シークレット ウィンドウ (Chrome では cmd + shift + n) を開いて、アプリのサインイン プロセスに戻ることをお勧めします。

于 2013-09-27T04:07:34.293 に答える