我正在使用密码重置路由的设计范围,它正在击中控制器,但不是控制器内部的实际方法。令人难以置信......任何帮助表示赞赏。
devise_scope :dashboard_users do
post 'forgot_password', to: 'sessions#forgot_password'
put 'reset_password', to: 'sessions#reset_password'
end
我的routes.rb中的那个,然后这是我的sessions_controller
class Api::Dashboard::V1::SessionsController < Devise::SessionsController
p "hello"
def forgot_password
...
end
end
它将打印&#34;你好&#34;但不会在方法中打印或执行任何代码。
hello
Processing by Api::Dashboard::V1::SessionsController#forgot_password as */*
Parameters: {"email"=>"jovannyadams@rmlabs.org"}
[Devise] Could not find devise mapping for path "/api/dashboard/v1/forgot_password".
This may happen for two reasons:
1) You forgot to wrap your route inside the scope block. For example:
devise_scope :user do
get "/some/route" => "some_devise_controller"
end
2) You are testing a Devise controller bypassing the router.
If so, you can explicitly tell Devise which mapping to use:
@request.env["devise.mapping"] = Devise.mappings[:user]
答案 0 :(得分:0)
我不知道你问题的确切答案,但我有一些想法。首先,p "hello"
将在文件加载时执行,而不是在请求上执行。这可能会让人感到困惑,因为Rails会根据请求自动重新加载控制器,打印“hello”消息。您可以在IRB控制台中测试它:
class Test
p "hello"
end
其次,我会看看你的rake routes
输出。您可能正在向错误的地方发送请求。我的预感是你需要将路线的to
设置调整为:
post 'forgot_password', to: 'api/dashboard/v1/sessions#forgot_password'
put 'reset_password', to: 'api/dashboard/v1/sessions#reset_password'
该更改会将请求指向您正确命名空间的控制器。以前的路由可能已将请求发送到您或Devise在全局命名空间上定义的其他会话控制器。
答案 1 :(得分:0)