如何使专家政策更加干燥?

Mat*_*ski 4 ruby ruby-on-rails pundit

在我的一个项目中,我开始使用 pundit gem,并且我有一个非常简单的策略,如下所示:

class CompanyPolicy < ApplicationPolicy
  def index?
    true if user.is_a? Administrator
  end

  def new?
    true if user.is_a? Administrator
  end

  def create?
    new?
  end

  def edit?
    true if user.is_a? Administrator
  end

  def update?
    edit?
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是我怎样才能避免重复这样的事情:

true if user.is_a? Administrator
Run Code Online (Sandbox Code Playgroud)

Seb*_*ian 6

我做的伎俩看起来像这样:

class ApplicationPolicy

  private

  def self.permit_owner_to(*actions)
    actions.each do |action|
      define_method("#{action}?") do
        owner?
      end
    end
  end

  def owner?
    # owner logic
  end

end
Run Code Online (Sandbox Code Playgroud)

并在其他政策中使用它

class ItemPolicy < ApplicationPolicy

  permit_owner_to :show, :update, :destroy, :confirm

end
Run Code Online (Sandbox Code Playgroud)