🌷

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を設定した。
  • パスワード更新での場合わけは以下。
    1. パスワード再設定の有効期限が切れていないか
    2. 無効なパスワードであれば失敗させる
    3. 新しいパスワードが空文字列になっていないか
    4. 成功
  • 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