パスワードを忘れたときは?Ruby on Rails:forgot password

      2012/08/15

パスワードを忘れてしまった・・・という場合にどうするか?
Ruby on Railsには便利なプラグイン「forgot password」があるのでこいつを使ってみましょう。(認証にはRestful authenticationを使う前提です)

インストールはこちらを参照
インストールにはgitが必要なのでgitをインストールしましょう。
git のソースは Index of /pub/software/scm/git より最新のものを取得します。

$ wget http://www.kernel.org/pub/software/scm/git/git-1.6.0.tar.gz
$ tar zxvf git-1.6.0.tar.gz
$ cd git-1.6.0
$ ./configure
$ make
$ make install

これでインストールは完了。

次にプラグインをインストール

$ ruby script/plugin install git://github.com/greenisus/forgot_password.git

次に、自分のプロジェクトのフォルダに移動して下記コマンド

$ ruby script/generate forgot_password <user>

<user>部分は、プロジェクトのユーザーモデルの名前を使います。
ちなみに僕の場合は
member
でした。

ただ、こんなエラーがでた。
-----------
The name 'MembersHelper' is either already used in your application or reserved by Ruby on Rails.
-----------

なんてこった。なにかぶつかるものがあって全然できない。
困った・・・・
というわけで、しょうがないので、既存のプロジェクトに一発でマージするのはあきらめ、全く新規のプロジェクトにてできたファイルをちくちくマージすることにした。ふぅ

$ rails hoge
テストプロジェクトをインストール
$ cd hoge #フォルダ移動
$ ruby script/generate forgot_password password member
パスワードのモデルを password
ユーザのモデルは member
なのでこんな感じでgenerateする。

中に入るとできるのは下記
--------------
Viewの中身はそのままコピーしてしまいましょう。
      create  app/views/passwords
      create  app/views/password_mailer
      create  app/views/passwords/new.html.erb
      create  app/views/passwords/reset.html.erb
      create  app/views/password_mailer/forgot_password.html.erb
      create  app/views/password_mailer/reset_password.html.erb

この辺もそのままコピーしてしまってOK。
      create  app/models/password.rb
      create  app/models/password_mailer.rb
      create  app/controllers/passwords_controller.rb
      create  app/helpers/passwords_helper.rb
      create  db/migrate/20090728083144_create_passwords.rb

/config/environment.rbに下記を追加
       route  map.resources :passwords
       route  map.change_password '/change_password/:reset_code', :controller => 'passwords', :action => 'reset'
       route  map.forgot_password '/forgot_password', :controller => 'passwords', :action => 'new'

一部ファイルに間違いがある
/app/controller/passwords_controller.rb
~~~~~~~~~~~~~~~~~
    respond_to do |format|
      if @member.update_attributes(params[:member])
       @password.destroy
        PasswordMailer.deliver_reset_password(@user)
        PasswordMailer.deliver_reset_password(@member)
        flash[:notice] = "Password was successfully updated. Please log in."
        format.html { redirect_to login_path}
      else
~~~~~~~~~~~~~~~~~
こんな感じなのだが
        PasswordMailer.deliver_reset_password(@user)
これは不要。削除します。

加えて
        format.html { redirect_to login_path}
ここは、パスワード再発行後にどこに飛ばしたいかを考えて適切に。
僕はこんな感じにしました。
        format.html { redirect_to :controller => '/login', :action => 'new'}
---------------

というわけで、簡単にセットアップが完了!お疲れ様でした。

おすすめ記事一覧

 - Tips