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

Row*_*ish 12 ruby-on-rails policies ruby-on-rails-4 pundit

我对Rails很新,我对以下策略有问题(使用Pundit):我想比较两个对象:@record并且@foo,如您所见:

class BarPolicy < ApplicationPolicy
  def show?
    @record.foo_id == @foo
  end
end
Run Code Online (Sandbox Code Playgroud)

我找不到将第二个参数传递给pundit方法(@foo)的好方法.

我想做点什么:

class BarsController < ApplicationController
  def test
    authorize bar, @foo, :show? # Throws ArgumentError
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Row*_*ish 16

我在这里找到了答案.

这是我的方式:

添加pundit_user功能ApplicationController:

class ApplicationController < ActionController::Base
include Pundit
def pundit_user
    CurrentContext.new(current_user, foo)
end
Run Code Online (Sandbox Code Playgroud)

创建CurrentContext类:

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

  def initialize(user, foo)
    @user = user
    @foo = foo
  end
end
Run Code Online (Sandbox Code Playgroud)

更新初始化Pundit方法.

class ApplicationPolicy
  attr_reader :user, :record, :foo

  def initialize(context, record)
    @user = context.user
    @foo = context.foo
    @record = record
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 在没有其他方法需要将大量参数传递给单个策略方法的情况下,编写大量代码的意义何在? (2认同)