パスワードを忘れたときは?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'}
---------------
というわけで、簡単にセットアップが完了!お疲れ様でした。