У меня есть приложение 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
.
Любые идеи будут полезны. Спасибо!