2016-09-26 2 views
0

Спасибо за чтение!Удобный способ реализации пользовательских ролей в моем приложении

В настоящее время я работаю над новым приложением, и ищу лучший способ для реализации следующей функции

По сценарию мне нужно реализовать «как пользователь а есть роль в расположении»

ЧТО I СОБЫТИЕ:

Сценарий: Когда пользователь добавляет новое местоположение в профиль , одно из требуемых полей - «роль». Это могут быть «гость», «менеджер» или «продавец». Каков наилучший способ выполнить его в модели?

Я совершил это с has_many_through Ассоциация

CONTROLLER:

def create 
    @location = Location.new(location_params) 
    @location.profiles << current_user.profile 
    #set user role 
    current_user.profile.profile_location_throughs.where(location_id: location.id).set_role(params[:location][:role]) 
    respond_to do |format| 
     if @location.save 
     .... 
     end 
    end 
end 

МОДЕЛИ:

class Profile < ActiveRecord::Base do 
    has_many :profile_location_throughs 
    has_many :locations, through: :profile_location_throughs 
end 

class Location < ActiveRecord::Base do 
    has_many :profile_location_throughs 
    has_many :locations, through: :profile_location_throughs 
end 

class ProfileLocationThrough < ActiveRecord::Base 
    # with boolean fields: manager, seller, guest 

    belongs_to :location 
    belongs_to :profile 

    def set_role(role) 
    case role 
     when "guest" 
     self.guest = true 
     when "seller" 
     self.seller = true 
     when "manager" 
     self.manager = true 
    end 
    end 

end 

=====

ВОПРОС: Не могли бы вы предложить более красивой путь реализовать его функцию?

+1

Может пользователь иметь разные роли в разных местах? Если да, правильно управлять ею через ассоциации. Но вместо того, чтобы просто сохранить имя роли в каждой записи через таблицу. Создайте таблицу «ролей» и соответствующую модель «Роль» и добавьте в нее связь через таблицу. –

+1

Я вижу, у вас есть 3 разных поля, по одному для каждой роли. Смотрите, это может быть плохо, потому что вам придется добавлять новое поле в модель всякий раз, когда определяется новая роль. Вместо этого вы должны сохранить отдельную поле 'role' и сохранить« гость »,« менеджер »или« продавец ». –

+0

Да. В одном месте это может быть «продавцом», другим «гостем» и т. Д. – Art

ответ

2

Существует несколько способов авторизации на основе ролей.

Самого простой способ заключается в добавлении к enum самим пользователям:

class Profile < ApplicationRecord 
    enum role: [:guest, :seller, :manager] 
end 

Это довольно ограничен, хотя, как это только позволяет «глобальная» роль. Если вам нужны роли в области ресурсов, вам нужна таблица соединений.

class Profile < ApplicationRecord 
    has_many :roles 
    has_many :locations, through: :roles 

    def has_role?(role, location = nil) 
    self.roles.exists?({ name: role, location: location}.compact) 
    end 

    def add_role(role, location) 
    self.roles.create!({ name: role, location: location }) 
    end 
end 

class Role < ApplicationRecord 
    belongs_to :profile 
    belongs_to :location 
end 

class Location < ApplicationRecord 
    has_many :roles 
    has_many :profiles, through: :roles 
end 

В этом примере мы просто использовать строку для roles.name столбца. Вы также можете использовать перечисление, если виды ролей ограничены. Если вы хотите использовать одну и ту же модель ролей (не предназначенную для каламбура) для роли ролей на разных ресурсах, вы можете использовать polymorphic belongs_to relationship.

class Role < ApplicationRecord 
    belongs_to :profile 
    belongs_to :resource, polymorphic: true 
end 

class Location < ApplicationRecord 
    has_many :roles, as: :resource 
    has_many :profiles, through: :roles 
end 

class OtherThing < ApplicationRecord 
    has_many :roles, as: :resource 
    has_many :profiles, through: :roles 
end 

Обратите внимание, что роли являются лишь частью решения для аутентификации. Вы бы объединили это с линией авторизации, такой как Pundit или CanCanCan, которая определяет правила о том, какую роль выполняет то, что и что делает и применяет эти правила.

+0

спасибо большое! Я бы реализовал таким образом – Art

Смежные вопросы