Rails - 创建用于检查用户角色的方法

时间:2016-10-27 07:51:23

标签: ruby-on-rails devise

我在我的应用程序的许多部分使用这种检查

if user_signed_in? && current_user.role.label == "admin"
      # do something
end

我决定在User模型(设计)中创建一个包含此检查的方法

# app/models/user.rb
def is_admin?
    user_signed_in? && self.role.label == "admin"
end

def is_editor?
    user_signed_in? && self.role.label == "editor"
end

# etc etc

所以我可以使用它,只是为了更多的可用性。

if current_user.is_admin?
   # do something
end

但是我收到未定义的user_signed_in错误?方法。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

user_signed_in?将是一个由设计添加的控制器方法我想象

我要么将其添加到帮助器中,要么将其作为应用程序控制器中的方法

class ApplicationController
  def is_admin?
    user_signed_in? && current_user.role.label == "admin"
  end
  helper_method :is_admin?

  def is_editor?
    user_signed_in? && current_user.role.label == "editor"
  end
  helper_method :is_editor?
end

helper_method将使视图可供访问

答案 1 :(得分:2)

signed_in不是模型中可用的方法,仅在控制器内。 current_user

都不是。 class ApplicationController helper_method :admin? def admin? current_user && current_user.role.label == "admin" end end

您最好在ApplicationController中创建一个方法。使它成为一个帮助方法,这样你也可以在视图中使用它......

<% if admin? %>
<%= "this is an admin" %>
<% end %>

然后您可以使用它,而不需要将其附加到用户对象。

>>> import datetime
>>> datetime.datetime.strptime('2015-02-03T05:04:01+0000', '%Y-%m-%dT%H:%M:%S+0000')
datetime.datetime(2015, 2, 3, 5, 4, 1)

答案 2 :(得分:1)

试试这个,如果想在用户模型中定义此方法,请执行此操作

用户模型中的

  def is_admin?
    self.role.label == "admin"
  end

并在你看来的任何地方使用它

<% if current_user && current_user.admin? %>

<% end %>

答案 3 :(得分:0)

更好的方法是使用rolify gem。 rolify允许您为用户创建角色,只需检查user.has_role

即可