Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 设计未调用正确的控制器进行密码重置_Ruby On Rails_Ruby_Devise_Routes_Passwords - Fatal编程技术网

Ruby on rails 设计未调用正确的控制器进行密码重置

Ruby 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

在我的RubyonRails应用程序中,我正在使用Desive for user auth

我的问题是通过电子邮件恢复密码-电子邮件会被发送,但生成的链接会调用UserController,而不是PasswordsController

这是我的档案:

型号/用户.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" }
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"