2013-12-03 2 views
6

Похоже, что политика Pundit не имеет доступа к параметрам сеанса. Поскольку конструкции не пересоединяют сеанс как допустимую переменную или метод. Есть ли способ доступа к сеансу или другим параметрам?Доступ к параметрам сеанса в политике Pundit

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

Адрес электронной почты: Где эта линия в вашем коде? Контроллер? – basgys

+0

Извините, пропустил ваш комментарий. Строка будет в ModelName_policy.rb. – Jerome

ответ

9

Я являюсь автором 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 класса.

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 в своих правилах.

+0

Что касается предоставления дополнительного контекста для областей? 'def index; resources = ContextPolicy :: Scope.new (current_user, context) .resolve; end' работает, но 'after_action: verify_policy_scoped, only:: index' triggers' Pundit :: PolicyScopingNotPerformedError'. Могу ли я заставить его работать в менталитете Pundit? – dira

+0

@dira Если вы используете класс упаковки для своего пользователя (в данном случае контекст пользователя), этот экземпляр контекста будет доступен внутри области вашей политики точно так же, как и внутри методов авторизации. – zeeraw

Смежные вопросы