具有两个输入参数的权威策略

时间:2015-01-29 14:05:43

标签: ruby-on-rails ruby-on-rails-4 pundit policies

我对Rails很新,我对以下政策有疑问(使用Pundit):我想比较两个对象:@record和{{1你可以在这里看到:

@foo

我没有找到将第二个参数传递给权威方法(@foo)的好方法。

我想做类似的事情:

class BarPolicy < ApplicationPolicy
  def show?
    @record.foo_id == @foo
  end
end

但是Pundit授权方法只允许两个参数。 有没有办法解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:14)

我在here找到答案。

这是我的方式:

pundit_user中添加ApplicationController功能:

class ApplicationController < ActionController::Base
include Pundit
def pundit_user
    CurrentContext.new(current_user, foo)
end

创建CurrentContext类:

/lib/pundit/current_context.rb
class CurrentContext
  attr_reader :user, :foo

  def initialize(user, foo)
    @user = user
    @foo = foo
  end
end

更新初始化Pundit方法。

class ApplicationPolicy
  attr_reader :user, :record, :foo

  def initialize(context, record)
    @user = context.user
    @foo = context.foo
    @record = record
  end
end

答案 1 :(得分:0)

除了当前用户和域模型之外,还有代码气味,但是如果确实需要,那么您可以使用具有任意数量参数的自定义查询方法,并且在不需要条件的情况下引发异常见过:

class BarPolicy < ApplicationPolicy
  def authorize_test?(foo)
    raise Pundit::NotAuthorizedError, "not authorized to test" unless record.foo_id == foo
  end
end

class BarsController < ApplicationController
  def test
    skip_authorization && BarPolicy.new(current_user, @record).authorize_test?(@foo)
    ...
  end
end

如果不使用skip_authorization &&,则不需要after_action :verify_authorized部分,我只是想展示一个单线,在这种情况下可以使用它来摆脱未经授权的异常要求批准该操作。