讓devise可以寄送修改密碼的信件給已登入使用者
2015-09-15 11:35:22

問題

我們想做到當使用者想要更改密碼的時候,可以在他的使用者後台按一個按鈕,就可以寄修改密碼的信件給他。devise預設是做不到的,因為處理寄送修改密碼信件的PasswordsController有個prepend_before_filter :require_no_authentication限制了使用者必須是未登入的狀態下才可以寄送修改密碼的信件。

解法

首先要建立一個自己的PasswordController繼承原本的Devise::PasswordsController,接著使用skip_before_filter :require_no_authentication, :only => [:create, :edit, :update]取消原本的filter。如果要在更改密碼的時候不讓使用被登出,還要overrideupdate這個method。

app/controllers/users/passwords_controller.rb

class Users::PasswordsController < Devise::PasswordsController
  skip_before_filter :require_no_authentication, :only => [:create, :edit, :update]

  def update
    super
    if resource.errors.empty?
      sign_out(resource_name)
      sign_in(resource_name, resource)
    end
  end
end

最後要記得修改routes讓devise使用你的controller。

config/routes.rb

devise_for :users, :controllers => {:passwords => 'users/passwords'}

Refs