虽然当前 Request 在您的子类中不会自动可用ActiveModel::Serializer,但您可以通过将其options包含在对UserSerializer.new.
如果您显式创建序列化程序,例如:
UserSerializer.new(@user, scope: current_user)
这意味着您可以简单地传递第二个选项,称为request:
UserSerializer.new(@user, scope: current_user, request: request)
从那时起,您可以通过调用来访问序列化程序中的当前请求options[:request]。例如,要检查内部的当前控制器UserSerializer,只需检查
options[:request].params[:controller]
如果它显示为"devise/sessions",则可以包含令牌。否则,如果您使用标准的 Devise 控制器来处理登录,您可能必须将Devise::SessionsController登录子类化并重新路由到新控制器:
# app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_with resource, location: after_sign_in_path_for(resource), request: request
end
end
# config/routes.rb
devise_scope :user do
post "sign_in" => "sessions#create", as: :user_session
end
请注意,我尚未对此进行测试。在阅读的源代码时ActionController::MimeResponds#respond_with,似乎给出的任何选项#respond_with都将向下传递给响应者,该响应者被劫持,ActionController::Serialization并且看起来选项一直传递到resource的序列化器中。
祝你好运!