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


我对Rails很新,我对以下策略有疑问(使用 权威人士):我想比较两个对象: @record 和 @foo,你可以在这里看到:

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

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

我想做的事情如下:

class BarsController < ApplicationController
  def test
    authorize bar, @foo, :show? # Throws ArgumentError
    ...
  end
end

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

谢谢!


6936
2018-01-29 14:05


起源



答案:


我找到了答案 这里

这是我的方式:

添加一个 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

13
2018-01-30 15:56



是 这是 记录它的正确方法。 - Arup Rakshit


答案:


我找到了答案 这里

这是我的方式:

添加一个 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

13
2018-01-30 15:56



是 这是 记录它的正确方法。 - Arup Rakshit