通过rails中的帮助方法访问用户属性

时间:2013-09-27 03:21:59

标签: ruby-on-rails ruby session ruby-on-rails-4

我写了这个辅助方法:

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?

1 个答案:

答案 0 :(得分:0)

根据此错误,您可以确定current_user返回的值为nil。所以问题不在于方法角色。您应该注意User.role是模型User上的类方法,因此它不会在一个特定用户上调用方法。另一方面,current_user.role是一个特定用户的实例方法,即登录的用户。

我会将以下内容放在抛出错误的方法上方:

raise session[:user_id].inspect

使用上述方法确认相应的user_id在会话cookie中后,您还可以将以下内容放在current_user帮助程序方法的末尾,以确认实际上正在返回用户:

raise @current_user.inspect 

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