密码重置到达控制器但不是设备方法

时间:2015-10-23 21:43:33

标签: ruby-on-rails ruby session devise passwords

我正在使用密码重置路由的设计范围,它正在击中控制器,但不是控制器内部的实际方法。令人难以置信......任何帮助表示赞赏。

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]

2 个答案:

答案 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)