看来Pundit政策不会访问会话参数。由于构造不会将会话重新组合为有效的变量或方法。有没有办法访问会话或其他参数?
class MyModelPolicy
def create?
@contructs = Construct.where(['id = ?', session[:construct_id]]).all
end
end
答案 0 :(得分:16)
我是Pundit的贡献者。默认情况下,策略只能访问当前用户和您正在检查权限的记录。
您可以使用context pattern defined in the Pundit docs。首先在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
。