如何使权威政策更加干燥?

时间:2015-02-16 07:45:39

标签: ruby-on-rails ruby 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

问题是如何避免重复此事:

true if user.is_a? Administrator

3 个答案:

答案 0 :(得分:3)

我的伎俩看起来像这样:

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

并在其他政策中使用

class ItemPolicy < ApplicationPolicy

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

end

答案 1 :(得分:2)

我实际上并不认为你需要删除它。通过重复此操作,您明确表示此用户必须是管理员才能访问此方法。如果你确实想要,你可以创建一个私有方法。

class CompanyPolicy < ApplicationPolicy
  def index?
    admin?
  end

  def new?
    admin?
  end

  def create?
    new?
  end

  def edit?
    admin?
  end

  def update?
    edit?
  end

  private 
     def admin?
        user.is_a? Administrator
     end
end

猜猜这是个人偏好的问题。

答案 2 :(得分:1)

您可以使用alias_method

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

  alias_method :create?, :index?
  alias_method :update?, :index?
end

您有一个可能已经包含的基类ApplicationPolicy

def new?
  create?
end

def edit?
  update?
end

所以你不需要在你的子类中重复这些方法。

.is_a?返回truefalse,因此无需明确返回true if true

那简洁得多了呃? :)