Как получить доступ к переменной @current_user, определенной в ApplicationController внутри Serializer - PullRequest
0 голосов
/ 24 апреля 2020

Я использую сериализаторы Active Model.

Я пытаюсь получить доступ к @current_user, который определен внутри ApplicationController, например:

class ApplicationController < ActionController::API
  before_action :authenticate_request

  private
  def authenticate_request
    auth_header = request.headers['Authorization']
    regex = /^Bearer /
    auth_header = auth_header.gsub(regex, '') if auth_header
    begin
      @current_user = AccessToken.get_user_from_token(auth_header)
    rescue JWT::ExpiredSignature
      return render json: {error: "Token expired"}, status: 401
    end
    render json: { error: 'Not Authorized' }, status: 401 unless @current_user
  end
end

Я могу использовать @current_user где угодно, кроме как внутри моего ProjectSerializer, который выглядит следующим образом:

class V1::ProjectSerializer < ActiveModel::Serializer
  attributes(:id, :name, :key, :type, :category, :created_at)
  attribute :is_favorited
  belongs_to :user, key: :lead

  def is_favorited
    if object.favorited_by.where(user_id: @current_user.id).present?
      return true
    else
      return false
    end
  end

end

ProjectSerializer находится в моей app/ структуре дерева проекта:

app/
  serializers/
    v1/
      project_serializer.rb

Я получаю ошибка при попытке доступа к @current_user:

NoMethodError in V1::UsersController#get_current_user
undefined method `id' for nil:NilClass 

Это происходит, когда я вызываю функцию из UserController, которая затем переходит к UserSerializer, а затем у этого сериализатора есть поле has_many :projects, которое вызывает ProjectSerializer.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете получить доступ к переменным, используя instance_options. Я считаю, что вы можете получить доступ к @current_user в контроллере проектов. Например:

def projects
  @projects = Project.all
  render_json: @projects, serializer: ProjectSerializer, current_user: @current_user
end

Внутри сериализатора вы можете получить доступ к current_user следующим образом:

 def is_favorited
    if object.favorited_by.where(user_id: @instance_options[:current_user].id).present?
      return true
    else
      return false
    end
  end
...