如何访问在 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
,然后该序列化程序具有调用 ProjectSerializer
的 has_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
我正在使用活动模型序列化程序。
我正在尝试访问 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
,然后该序列化程序具有调用 ProjectSerializer
的 has_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