上記の回答を組み合わせて、次のことを思いつきました。
class ApplicationPolicy
attr_reader :user
def initialize(user)
@user = user
end
def self.permit(roles, options)
return if options[:to].none?
options[:to].each do |action|
define_method("#{action}?") do
return @user.roles? Array.wrap(roles) if options[:when].blank?
send(options[:when]) and @user.roles? Array.wrap(roles)
end
end
end
end
これにより、次のように使用できます。
class CommentPolicy < ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@record = record
super(user)
end
permit %i[admin member], to: %i[show edit destroy update], when: :created_by_user
def created_by_user
@record.user == @user
end
end
と
permit :admin, to: %i[index update edit]
同様に動作します
user
モデルからの私のロールメソッドは次のようになります:
def roles?(user_roles)
user_roles.each do |role|
return true if role?(role)
end
false
end
def role?(role)
roles.any? { |r| r.name.underscore.to_sym == role }
end