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

使用上述方法确认会话 cookie 中有适当的 user_id 后,您还可以在 current_user 辅助方法的末尾添加以下内容,以确认实际返回了用户:

raise @current_user.inspect 

您用来创建会话 [:user_id] 的逻辑是什么?此外,您可能希望清除浏览器缓存或打开隐身窗口(在 chrome 中为 cmd + shift + n)并返回应用程序的登录过程。

于 2013-09-27T04:07:34.293 回答