🌷
Rails チュートリアル 12章
まえがき
Railsチュートリアル12章において押さえておいた方がいいポイントをまとめ、12章の学習内容を俯瞰し整理することを目的とする。
変更したファイル
| ファイル名 | 説明 |
|---|---|
| routes.rb | password_resetsをリソースとして指定し、アクションnew,create,edit,updateを作成。 |
| new.html.erb | ログインページのビューのパスワード入力の部分に、forgot passwordリンクを作成。(sessionのnew) |
| user.rb | create_reset_digest,send_password_reset_emailメソッドを追加。 |
| user_mailer.rb | password_resetメソッドに宛先とメールの題名を追加。 |
| password_reset.text.erb | パスワード再設定メールの文面を追加。 |
| password_reset.html.erb | パスワード再設定メールをHTMLタグ込みで追加。 |
| user_mailer_preview.rb | railsのpreview機能を用いるときのpassword_resetメールの表示に関する定義を追加。 |
| user_mailer_test.rb | account_activationと同じような感じでテストを記述。 |
追加したファイル
| ファイル名 | 作成方法 | 説明 |
|---|---|---|
| password_resets_controller.rb | generate controllerで自動作成 | create,updateアクションを追加。またprivateとしてユーザーを取得し、正しいユーザーかを確かめるメソッド、トークンが期限切れか確認するメソッドをbeforeフィルタを追加。 |
| <タイムスタンプ>_add_reset_to_users_digest.rb | generate migrationで自動作成 | 特別な設定がないので追加したままデフォルト状態で放置。 |
| new.html.erb | generate controllerで自動作成 | パスワード設定画面のビューを設定した。(再設定案内送り先メアド入力) |
| edit.html.erb | generate controllerで自動作成 | パスワード設定画面のビューを設定した。 |
| password_resets_test.rb | generate integration_testで自動作成 | パスワード再設定周りのテストを追加した。 |
RESTfulの名前付きルーティング命名規則
| HTTP動詞 | パス | コントローラ#アクション | 名前付きルート |
|---|---|---|---|
| GET | /users | users#index | users_path |
| GET | /users/:id | users#show | user_path(id) |
| GET | /users/new | users#new | new_user_path |
| POST | /users | users#create | users_path |
| GET | /users/:id/edit | users#edit | edit_user_path(id) |
| PATCH/PUT | /users/:id | users#update | user_path(id) |
| DELETE | /users/:id | users#destroy | user_path(id) |
具体的には、
| アクション名 | 形式 |
|---|---|
| index | コントローラー名(複数形)_path |
| create | コントローラー名(複数形)_path |
| show | コントローラー名(単数形)_path(インスタンス変数) |
| new | new_コントローラー名(単数形)_path |
| edit | edit_コントローラー名(単数形)_path |
| update | コントローラー名(単数形)_path(インスタンス変数) |
| destroy | コントローラー名(単数形)_path(インスタンス変数) |
path、urlの使い分け
基本的にpathは相対パス、urlは絶対パスなので、外部からアクセスしなくてはならない場合は後者を、そうでなければ前者を用いるのが一般的。簡単な判断基準はリダイレクトか否か。外部からのアクセスが必要か否か。
今回は、送ったメールからアクセスしてパスワードを再設定する必要があるため、そこに関わるアクションであるedit,updateはurlで名前付きルーティングを用いる。
メール内のリンクのurlに引数があるのは?
メールないリンクの引数は、ユーザー個人のページにアクセスさせるために必要な情報を動的に受け取ってURLを開いてもらうためである。例えば以下の通り。
password_reset_html.erb
edit_password_url(@user.reset_token, email: @user.email)
完全体のURLでは、
ルートのURL/コントローラー名/トークン/アクション名?email=メールアドレス
のような記述の仕方をするため、このトークン部分と、メールアドレス部分がわからない限り適切なページを開くことができないためそれぞれ引数として渡している。
他にしたこと
- ビュー(new)で指定されているscope:とは、フォームを送信した際に、ハッシュparamsに格納されるハッシュの名前である。この命名においてはインスタンス変数を用いると、普通の変数として扱われハッシュにできない。
- 新たな仮想属性reset_token,属性reset_digest,reset_sent_atを追加した。
- パスワード再設定メールの文面、プレビューの設定を多なった。
- パスワード再設定メールを送るメソッドsend_password_reset_email,パスワード再設定用の属性を与えるcreate_reset_digestを設定した。
- パスワード更新での場合わけは以下。
- パスワード再設定の有効期限が切れていないか
- 無効なパスワードであれば失敗させる
- 新しいパスワードが空文字列になっていないか
- 成功
- errors.addを用いることでエラーメッセージを追加できる。
- password_resets_testファイルのテストrest with valid emailについては、フォーム送信が正常に行われたかの確認。reset with right email and right tokenはメールで送られたフォームをもとに正しいパスワード再設定ページが開くかどうかの確認である。
- password_resets_testファイルのPasswordResetFormクラスの@user,@reset_userは同じに見えるものの、間でpassword_resets_pathを呼び出すことにより、reset_digestが更新されている!完全に同じではない。
- データベースに入っていた情報をいじるような作業をするテストを記述した場合は、reloadメソッドを一度読み出すのが大事!
Discussion