devise_for 路由在范围内时重置用户密码
Resetting user password when devise_for routes are in scope
在我的应用程序中,所有路由都限定在一个语言环境中,该用户选择如下:
scope ":locale", locale: /#{SpreeI18n::Config.supported_locales.join('|')}/ do
devise_for :users, skip: :omniauth_callbacks
get '/', to: 'homepage#index', :as => :homepage
end
当我想像User.find(1).send_reset_password_instructions
一样发送重置密码指令时,出现了问题:
Devise::Mailer#reset_password_instructions: processed outbound mail in 4249.9ms
ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"devise/passwords", :reset_password_token=>"-zyuNkscVkwFn2awdm27"} missing required keys: [:locale]
如何传递语言环境以便发送重置令牌?
让我们为 password
创建一个自定义控制器:
自定义routes.rb
scope ":locale", locale: /#{SpreeI18n::Config.supported_locales.join('|')}/ do
devise_for :users, skip: :omniauth_callbacks, controllers: { passwords: 'my_passwords' }
get '/', to: 'homepage#index', :as => :homepage
end
my_passwords_controller.rb
class MyPasswordsController < Devise::PasswordsController
def create
resource_params.merge!(locale: 'en') # use 'en' for eg
super
end
end
然后 send_reset_password_instructions
函数将在发送电子邮件时采用您自定义的 resource_params
。
请参考devise sourcecode了解devise的详细作用!
在我的应用程序中,所有路由都限定在一个语言环境中,该用户选择如下:
scope ":locale", locale: /#{SpreeI18n::Config.supported_locales.join('|')}/ do
devise_for :users, skip: :omniauth_callbacks
get '/', to: 'homepage#index', :as => :homepage
end
当我想像User.find(1).send_reset_password_instructions
一样发送重置密码指令时,出现了问题:
Devise::Mailer#reset_password_instructions: processed outbound mail in 4249.9ms
ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"devise/passwords", :reset_password_token=>"-zyuNkscVkwFn2awdm27"} missing required keys: [:locale]
如何传递语言环境以便发送重置令牌?
让我们为 password
创建一个自定义控制器:
自定义routes.rb
scope ":locale", locale: /#{SpreeI18n::Config.supported_locales.join('|')}/ do devise_for :users, skip: :omniauth_callbacks, controllers: { passwords: 'my_passwords' } get '/', to: 'homepage#index', :as => :homepage end
my_passwords_controller.rb
class MyPasswordsController < Devise::PasswordsController def create resource_params.merge!(locale: 'en') # use 'en' for eg super end end
然后 send_reset_password_instructions
函数将在发送电子邮件时采用您自定义的 resource_params
。
请参考devise sourcecode了解devise的详细作用!