如何在此角色助手中创建通用方法以将其传递给多个控制器?
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。
在其他控制器中,我会定义它们的值并再次包含这个助手。
有没有选择呢?
答案 0 :(得分:0)
基本上有三种角色系统:
class User
enum role: [:a, :b, :c]
end
这对于用户只能拥有一个角色的最简单的情况非常有用。
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库结合起来。
阵列列,非规范化表等等都有大量的黑客尝试。我甚至在当天自己做了一个。没有什么可以感到羞耻的,但是授权是一个你应该谦虚地认识到许多眼睛比一个人更好的领域。