如何访问在 Serializer 内部的 ApplicationController 中定义的 @current_user 变量

How to access @current_user variable defined in ApplicationController inside of Serializer

我正在使用活动模型序列化程序。

我正在尝试访问 ApplicationController 中定义的 @current_user,如下所示:

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,然后该序列化程序具有调用 ProjectSerializerhas_many :projects 字段。

您可以使用 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