Rails 5.1:用于将角色信息传递给控制器​​的通用帮助程序

时间:2017-05-20 10:38:33

标签: ruby-on-rails ruby

如何在此角色助手中创建通用方法以将其传递给多个控制器?

module Common::RolesHelper

  def index_roles
    unless @roles.any? { |role| role.viewer_rolevalue? ||
                                role.editer_rolevalue? ||
                                role.creater_rolevalue? || 
                                role.deleter_rolevalue? }
    redirect_to errors_path
    end
  end

end

我的模型看起来像这样:

class Role < ApplicationRecord
  belongs_to :user, optional: true, inverse_of: :roles
  accepts_nested_attributes_for :user
  validates :user, presence: true

  enum general: { seller: 1, buyer: 2, seller_buyer: 3}, _suffix: true
  enum dashboard: { denied: 0, viewer: 1, editer: 2, creater: 3, deleter: 4}, _suffix: true
  # more follow here...

end

我天真的想法是,我可以包含这个帮助器,然后在DashboardsController中以某种方式定义,例如,rolevalue=dashboard

然后这个特定的代码适用于Dashboards。

在其他控制器中,我会定义它们的值并再次包含这个助手。

有没有选择呢?

1 个答案:

答案 0 :(得分:0)

基本上有三种角色系统:

1。简单使用枚举:

class User
  enum role: [:a, :b, :c]
end

这对于用户只能拥有一个角色的最简单的情况非常有用。

2。三张桌子:

class User < ApplicationRecord
  has_many :user_roles
  has_many :roles, through: :user_roles

  has_role?(name, resource = nil)
    roles.exist?({ name: name, resource: resource }.compact)
  end
end

class Role < ApplicationRecord
  has_many :user_roles
  belongs_to :resource, polymorphic: true, optional: true
end

class UserRole < ApplicationRecord
  belongs_to :user
  belongs_to :role
end

这里的关键是roles是一个单独的规范化表。直接在roles上存储用户ID会导致一遍又一遍地复制角色定义(考虑使用name: "admin"的1000行。)

Rolify如果你想比重新发明轮子更好地花时间,那就太棒了。将它与像Pundit这样的auth库结合起来。

3。一个hacky蒸笼:

阵列列,非规范化表等等都有大量的黑客尝试。我甚至在当天自己做了一个。没有什么可以感到羞耻的,但是授权是一个你应该谦虚地认识到许多眼睛比一个人更好的领域。