Включить current_user в ActiveModel::Serializer

У меня есть приложение rails только для API, использующее active_model_serializers 0.10. У меня есть атрибут current_user в моем ApplicationController, и я пытаюсь получить к нему доступ из своих сериализаторов, чтобы ограничить отображаемые данные. Я могу сделать это, передав его в область видимости вручную, как это ExerciseSerializer.new(@exercise, scope: current_user), но хотел бы иметь общее решение.

Это мой ApplicationController:

class ApplicationController < ActionController::API
  include Response
  include ExceptionHandler

  serialization_scope :view_context

  # called before every action on controllers
  before_action :authorize_request
  attr_reader :current_user

  def check_access_rights(id)
    @current_user.id == id
  end

  def check_admin_rights
    if !@current_user.admin
      raise(ExceptionHandler::AuthenticationError, Message.unauthorized)
    end
  end

  private

  # Check for valid request token and return user
  def authorize_request
    @current_user = (AuthorizeApiRequest.new(request.headers).call)[:user]
  end

end

Это один из моих сериализаторов:

class ExerciseSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :image_url, :note
  delegate :current_user, :to => :scope
  has_many :exercise_details

end

И вот как я представляю объекты:

  def json_response(object, status = :ok)
    render json: object, status: status
  end

При сериализации получаю следующую ошибку:

** Module::DelegationError Exception: ExerciseSerializer#current_user delegated to scope.current_user, but scope is nil:

Когда я пытаюсь получить доступ к current_user из сериализатора, я получаю следующую ошибку:

*** NameError Exception: undefined local variable or method `current_user' for #<ExerciseSerializer:0x007ff15cd2e9c0>

И, очевидно, область действия nil.

Любые идеи будут полезны. Спасибо!


person smeshko    schedule 14.06.2017    source источник


Ответы (1)


Нашел его случайно после бесчисленного количества безуспешных прочтений официальных документов: https://www.driftingruby.com/episodes/rails-api-active-model-serializer

Итак, вот интересная часть:

def current_user_is_owner
  scope == object
end

Таким образом, current_user сохраняется в переменной scope по умолчанию, вам не нужно добавлять код в контроллер для его извлечения.

Работает в версии 0.10 и доступна с версии 0.08: https://github.com/rails-api/active_model_serializers/search?utf8=%E2%9C%93&q=scope&type=

person abdourakhmane    schedule 06.10.2017