虽然当前 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
的序列化器中。
祝你好运!