Доступ к параметрам сеанса в политике Pundit

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

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

person Jerome    schedule 03.12.2013    source источник
comment
Где эта строка в вашем коде? Контроллер?   -  person basgys    schedule 15.01.2014
comment
Извините, пропустил ваш комментарий. Строка будет в ModelName_policy.rb.   -  person Jerome    schedule 11.04.2014


Ответы (1)


Я сотрудничаю с Pundit. Политики по умолчанию имеют доступ только к текущему пользователю и записи, для которой вы проверяете разрешения.

Вы можете использовать шаблон контекста, определенный в документации Pundit. Начните с создания класса пользовательского контекста в вашем каталоге app/model, принимающего все необходимые вам контекстные параметры, в данном случае session.

class UserContext
  attr_reader :user, :session

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

Затем вы можете переопределить запись пользователя, используемую pundit, экземпляром вашего класса 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 внутри ваших политик.

person zeeraw    schedule 15.01.2015
comment
Как насчет предоставления дополнительного контекста для областей видимости? def index; resources = ContextPolicy::Scope.new(current_user, context).resolve; end работает, но after_action :verify_policy_scoped, only: :index вызывает Pundit::PolicyScopingNotPerformedError. Могу ли я заставить это работать в рамках мышления Pundit? - person dira; 16.03.2015
comment
@dira Если вы используете класс-оболочку для своего пользователя (в данном случае контекста пользователя), этот экземпляр контекста будет доступен внутри вашей области политики так же, как и внутри методов авторизации. - person zeeraw; 17.03.2015
comment
Вам не хватает атрибута attr_reader для записи. +1 за ответ - person Jamesst20; 12.02.2019