Rails — создаем методы для проверки ролей пользователей

Я использую такие проверки во многих частях своего приложения.

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

Я решил создать метод в модели User (devise), который будет содержать эту проверку

# 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? метод. Как я могу это решить?


person ltdev    schedule 27.10.2016    source источник


Ответы (4)


signed_in не является методом, доступным в модели, только в контроллере. Как и current_user

Вам лучше создать метод в ApplicationController. Сделайте его вспомогательным методом, чтобы вы также могли использовать его в представлениях...

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

Затем вы можете использовать его, и вам не нужно прикреплять его к пользовательскому объекту.

<% if admin? %>
<%= "this is an admin" %>
<% end %>
person SteveTurczyn    schedule 27.10.2016

Я думаю, что user_signed_in? будет методом контроллера, добавленным devise

Я бы либо добавил его в помощник, либо использовал его как метод в вашем контроллере приложения.

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 сделает его доступным для просмотра

person j-dexx    schedule 27.10.2016

Попробуйте это, если хотите определить этот метод в пользовательской модели, сделайте так

в пользовательской модели

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

И используйте его в любом месте, на ваш взгляд, вот так

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

<% end %>
person Navin    schedule 27.10.2016

Лучше использовать гем rolify. rolify позволяет вам создавать роли для вашего пользователя, и вы просто проверяете user.has_role

person Junaid Atique    schedule 27.10.2016
comment
Я следил за этим github .com/plataformatec/devise/wiki/ для добавления ролей - person ltdev; 27.10.2016