看来Pundit策略不访问会话参数.由于构造不会将会话重新组合为有效的变量或方法.有没有办法访问会话或其他参数?
class MyModelPolicy def create? @contructs = Construct.where(['id = ?', session[:construct_id]]).all end end
zeeraw.. 20
我是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
您的政策.
我是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
您的政策.