8

/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

4 回答 4

11

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

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

您的视图代码必须处理这个 - 例如。

<% if current_user.present? && current_user.role?('gen_admin') %>
于 2013-04-18T08:19:01.507 回答
2

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

@user=User.new

现在你可以打电话@user.role?

如果您想role?通过模型可用,User那么您应该将其定义为类方法并传入一个对象以进行验证

def self.role?(user)

...

end
于 2013-04-18T07:15:24.760 回答
1

您需要将视图中的代码更改为使用current_user而不是User,并role?正确调用该方法(否==)。如果在未登录用户可以访问的视图中使用它,您需要确认用户首先登录(因此您不要尝试调用role?on nil,这会引发异常):

<% if current_user && current_user.role?("gen_admin") %>
  <li>
    <%= link_to('Admin', users ) %>
  </li>
<% end %>
于 2013-04-18T07:33:18.713 回答
-1

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

于 2013-04-18T07:17:19.000 回答