试图在Rails中获得“当前用户”

时间:2013-04-18 06:43:07

标签: ruby-on-rails

/views/layouts目录中,如何获取当前用户?我正在使用Devise,但current_user由于某种原因在这里不起作用,它将其描述为一种未知方法。我想做点什么:

<% if User.role? == "gen_admin" %>
    <li>
    <%= link_to('Admin', users ) %>
    </li>
<% end %>

我的用户模型中定义了role?方法,但我仍然遇到此异常:

undefined method 'role?' for #<Class:0x3fcc1e0>

那么如何获取当前用户,并在源树的这个级别访问其字段?谢谢!

这是角色?方法:

# in User
ROLES = %w[gen_admin teacher_admin student]
def role?(base_role)
  ROLES.index(base_role.to_s) <= ROLES.index(role)
end

4 个答案:

答案 0 :(得分:8)

您的代码必须考虑用户何时登录以及何时未登录。

如果没有用户登录,则current_user将返回nil(如您的情况,您认为这是Devise的错误)。

您的视图代码必须处理此问题 - 例如。

<% if current_user.present? && current_user.role?('gen_admin') %>

答案 1 :(得分:2)

您已将role?方法定义为实例方法。这意味着为了使用它,您应该首先从User类创建实例,例如:

@user=User.new

现在您可以致电@user.role?

如果您希望role?可以通过模型User使用,那么您应该将其定义为类方法,并在对象中传递以进行验证

def self.role?(user)

...

end

答案 2 :(得分:1)

您需要更改视图中的代码才能使用current_user而非User,并正确调用role?方法(否==)。如果在未登录用户可以访问的视图中使用此功能,则需要先确认用户已登录(因此您不要尝试在{{1}上调用role?这会产生异常):

nil

答案 3 :(得分:-1)

您是否忘记在控制器中添加before_filter :authenticate_user!?这将确保您的视图中可以使用current_user