我有一个使用Devise的Rails API。当您点击POST / login端点时,它将登录用户并提供JWT。直到我最近将控制器版本命名为我的控制器的命名空间,所有这些都工作良好。这是我的session#create方法的样子:
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
render json: current_user
end
从前端发出登录请求时,我的参数如下所示:
{
user: {
email: 'john@gmail.com',
password: 'password'
}
}
这以前是可行的,但是现在我已迁移到会话控制器的Api :: V1命名空间,它要求前端在:api_v1_user而不是:user下提交凭据。
有没有一种方法可以更改session#create函数以查看:user属性,而不查看:api_v1_user?
更新
namespace :api do
namespace :v1 do
devise_for :users,
path: '',
path_names: {
sign_in: 'login',
sign_out: 'logout',
registration: 'signup'
},
controllers: {
sessions: 'api/v1/sessions',
registrations: 'api/v1/registrations'
}
答案 0 :(得分:0)
好吧,我知道了。感觉很hack,但是可以用。这是我将Api :: V1 :: SessionsController创建方法更改为:
def create
# Changing scope from :api_v1_user to :user
Devise.mappings[:user] = Devise.mappings[:api_v1_user]
warden.config[:default_strategies][:user] = warden.config[:default_strategies].delete(:api_v1_user)
auth_opts = auth_options
auth_opts[:scope] = :user
self.resource = warden.authenticate!(auth_opts)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
render json: current_api_v1_user
end