Ruby on rails 设计未调用正确的控制器进行密码重置
在我的RubyonRails应用程序中,我正在使用Desive for user auth 我的问题是通过电子邮件恢复密码-电子邮件会被发送,但生成的链接会调用UserController,而不是PasswordsController 这是我的档案: 型号/用户.rbRuby on rails 设计未调用正确的控制器进行密码重置,ruby-on-rails,ruby,devise,routes,passwords,Ruby On Rails,Ruby,Devise,Routes,Passwords,在我的RubyonRails应用程序中,我正在使用Desive for user auth 我的问题是通过电子邮件恢复密码-电子邮件会被发送,但生成的链接会调用UserController,而不是PasswordsController 这是我的档案: 型号/用户.rb class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :trackable, :omni
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :recoverable, :trackable, :omniauthable, :omniauth_providers => [:google_oauth2]
...
# user authentication
devise_for :users, :controllers => { :passwords => "devise/passwords", :omniauth_callbacks => "users/omniauth_callbacks" }
config/routes.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :recoverable, :trackable, :omniauthable, :omniauth_providers => [:google_oauth2]
...
# user authentication
devise_for :users, :controllers => { :passwords => "devise/passwords", :omniauth_callbacks => "users/omniauth_callbacks" }
运行rake路由
...
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
...
电子邮件链接
http://ugolanguage-testing.herokuapp.com/users/password/edit.3?reset_password_token=BHybmnzKnsK3L-xdvRGm
错误消息
2014-08-07T19:36:10.157145+00:00 heroku[router]: at=info method=GET path="/assets/webfonts/ss-standard-e13c0260a956bb5b5817b9fb5dc8de78.woff" host=ugolanguage-testing.herokuapp.com request_id=14f68207-c73a-41b6-84d6-e67709ffc4fc fwd="207.58.203.50" dyno=web.1 connect=1ms service=3ms status=304 bytes=1372
2014-08-07T19:36:20.834814+00:00 app[web.1]: Started GET "/users/password/edit.3?reset_password_token=[FILTERED]" for 207.58.203.50 at 2014-08-07 19:36:20 +0000
2014-08-07T19:36:21.225014+00:00 app[web.1]: Processing by UsersController#edit as
2014-08-07T19:36:21.255102+00:00 app[web.1]: Completed 500 Internal Server Error in 30ms
2014-08-07T19:36:21.225027+00:00 app[web.1]: Parameters: {"reset_password_token"=>"[FILTERED]", "id"=>"password"}
2014-08-07T19:36:22.739300+00:00 heroku[router]: at=info method=GET path="/users/password/edit.3?reset_password_token=BHybmnzKnsK3L-xdvRGm" host=ugolanguage-testing.herokuapp.com request_id=d0cd5b9a-3913-4e84-b69c-c7a2508dc019 fwd="207.58.203.50" dyno=web.1 connect=1ms service=1919ms status=500 bytes=1314
2014-08-07T19:36:22.737206+00:00 app[web.1]:
2014-08-07T19:36:22.737213+00:00 app[web.1]: app/controllers/users_controller.rb:55:in `check_admin'
2014-08-07T19:36:22.737211+00:00 app[web.1]: NoMethodError (undefined method `admin?' for nil:NilClass):
从错误信息中我得到了Desive所期待的感觉
<address to password controller><id><token>
这只对现有Desive控制器的自定义操作是必需的,但没有任何更改
顺便说一下,我有一个controllers/designe/password_controllers.rb
你知道我能做些什么来解决这个问题吗?我可能会从routes.rb中删除“design_for”,然后手动执行所有designe routes
此外,这是正在进行的
查看/设计/邮寄/重置密码\u说明。html.haml:
...
%p= link_to 'Change my password', edit_user_password_url(@resource, :reset_password_token => @token)
...
在您的config/routes.rb中
# user authentication
devise_for :users, :controllers => { :passwords => "devise/passwords", :omniauth_callbacks => "users/omniauth_callbacks" }
似乎您已指示Deave使用新的密码控制器,您是否创建了该控制器,您要求Deave使用一个名为passwords的控制器,该控制器存在于您的应用程序/控制器/Deave中,而不是gem的控制器中
你创建了这个控制器,里面的代码是什么。如果没有,您的设计路线应为:
# user authentication
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
谢谢你的回答 是的,我从Devise的github for passwords_controller.rb复制了代码,并将其放在app/controllers/Devise文件夹中。我也尝试过不使用它,也没有提到design_for at routes.rb 但我确实发现了错误-在routes.rb上,这些行导致rails将我的请求路由到错误的位置:
get "users/new" => "users#new", as: :new_user
post "users" => "users#create"
get "users/:id/edit" => "users#edit", as: :edit_user
patch "users/:id" => "users#update", as: :user
这是由以前的开发人员完成的,他安装Desive时没有“可恢复”选项。将切换他的代码,这样我就可以返回到designe的默认路由行为“designe_for”
谢谢
更新:
...
%p= link_to 'Change my password', edit_user_password_url(@resource, :reset_password_token => @token)
...
更简单的是,只需切换订单。。。。现在我的routes.rb文件如下所示
# user authentication
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
get "users/new" => "users#new", as: :new_user
post "users" => "users#create"
get "users/:id/edit" => "users#edit", as: :edit_user
patch "users/:id" => "users#update", as: :user
delete "/users/:id" => "users#destroy"