11

Pundit 策略似乎不访问会话参数。As 构造不会将会话重新识别为有效的变量或方法。有没有办法访问会话或其他参数?

class MyModelPolicy
  def create?
    @contructs = Construct.where(['id = ?', session[:construct_id]]).all
  end
end
4

1 回答 1

23

我是 Pundit 的撰稿人。默认情况下,策略只能访问当前用户和您正在检查权限的记录。

您可以使用Pundit 文档中定义的上下文模式。首先在您的目录中创建一个用户上下文类,该类app/model接受您需要的所有上下文参数,在本例中为session.

class UserContext
  attr_reader :user, :session

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

UserContext然后,您可以用您的类的实例覆盖 pundit 使用的用户记录。

class ApplicationController
  include Pundit

  def pundit_user
    UserContext.new(current_user, session)
  end
end

通过使您的应用程序策略接受上下文来完成。如果您想保持与旧策略的兼容,请将这些方法委托给上下文。

class ApplicationPolicy
  attr_reader :context, :user, :session

  def initialize(context, record)
    @context = context
    @record = record
  end

  delegate :user, to: :context
  delegate :session, to: :context

  ...

end

现在您可以访问session您的政策内部。

于 2015-01-15T13:58:08.493 回答