Rails 3 / Devise: проверка, есть ли у пользователей несколько ролей - PullRequest
2 голосов
/ 28 марта 2011

У меня есть модель пользователей с Devise, и я настроил роли, чтобы пользователям можно было назначить одну или несколько ролей.Если я хочу проверить роль пользователя в, скажем, представлении, следующий код работает ...

<% if current_user.roles.include? Role.find_by_name('Administrator') %>
     You are an administrator!
<% end %>

Но теперь, скажем, я хочу проверить, есть ли у пользователя одна из нескольких ролей, чтобыпосмотрите, являются ли они администратором или редактором.Я был уверен, что следующее будет работать ....

<% if current_user.roles.include? Role.find_by_name('Administrator' || 'Editor') %>

... но это не так, это работает, только если вы являетесь администратором и игнорируете проверку всех других ролей после первой в этомсписок.Я пробовал другие комбинации, такие как Role.find_by_name (['Administrator', 'Editor']) и еще много чего, но безуспешно.Как именно я отформатирую это, чтобы выполнить проверку для нескольких ролей?Я охотился по всему Google, но во всех примерах используется одна роль.

Ответы [ 3 ]

5 голосов
/ 28 марта 2011

Первая проблема заключается в том, что при использовании синтаксиса «Администратор» ||«Редактор» не будет создавать синтаксис SQL ИЛИ.Вместо этого происходит то, что Ruby вычисляет, что «Администратор» считается ИСТИННЫМ значением, и передает его в метод find_by_name.Редактор никогда не получает отправку.

Вторая проблема заключается в том, что даже если вы измените синтаксис на ['Administrator', 'Editor'], метод find_by_name всегда возвращает только одну запись.вероятно, сделал бы что-то вроде этого:

Role.where(:name => ['Administrator', 'Editor']).all

Это вернет эти две роли.

Редактировать

Я подумал немного об этом, потому что это не очень хорошая практикарешение разместить этот вид логики базы данных в представлениях.Вот еще один способ, который немного больше подходит к концепции MVC:

class User < ActiveRecord::Base
  ...

  def has_role?(*role_names)
    self.roles.where(:name => role_names).present?
  end
end

# In the views
<% if current_user.has_role?('Administrator', 'Editor') %>
0 голосов
/ 15 ноября 2014

При использовании устройства 3 и выше current_user.has_any_role?(:Administrator, :Editor)

Ниже приведены все методы устройства для проверки роли, которые можно использовать;

current_user.has_role?(role_name, resource = nil)
current_user.has_all_roles?(*args)
current_user.only_has_role?(role_name, resource = nil)
current_user.has_any_role?(*args)
0 голосов
/ 28 марта 2011

Вы должны взглянуть на cancan: http://railscasts.com/episodes/192-authorization-with-cancan Это поможет вам сохранить правила авторизации в одном месте, не распространяя их на ваши представления и контроллеры.

...