【问题标题】:Resetting user password when devise_for routes are in scope当 devise_for 路由在范围内时重置用户密码
【发布时间】:2016-03-01 10:39:43
【问题描述】:

在我的应用程序中,所有路由都限定在一个区域设置范围内,该用户已选择如下:

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]

如何传递语言环境以便发送重置令牌?

【问题讨论】:

    标签: ruby-on-rails devise devise-recoverable


    【解决方案1】:

    让我们为password 创建一个自定义控制器:

    1. 自定义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
      
    2. 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的详细功能!

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2018-09-24
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多