Rails Tutorialで学べることメモ-第12章-
Rails Tutorial を改めてしっかりやり直してのメモ第 12 章編
https://railstutorial.jp/chapters/password_reset?version=7.0
便利なコマンド・メソッド
rails generate controller ResourceName action1 action2 --no-test-framework
generate コマンドのオプションに--no-test-framework
を指定すると、テストファイルは生成されない。
統合テスト等でカバーする場合、つまり単体テストは不要なリソースの場合に便利。
hidden_field_tag
vs f.hidden_field
ともに第一引数にフィールド名、第二引数に値を取る。
hidden_field_tag :email, @user.email
f.hidden_field :email, @user.email
二つの差は、params ハッシュにどのように値が入ってくるかである。
前者がparams[:email]
、後者はparams[:user][:email]
となる。
errors.add(:target, :blank)
errors.add(:email, "空欄です")
のようにメッセージを文字列で書くこともできるが、:blank
のようにデフォルトの空白バリデーションメッセージを指定することもできる。
このようにすると、rails-i18n gem で多言語化するときに適切に対応される。
知識
パスワードリセット時のメールアドレス
パスワードのリセットを行うフォームで、メール送信の成功失敗がわかるインタラクションを実装すると、特定のアドレスがサービスに登録されているかどうかがわかる。
これは危険ではないか?と指摘されることがあるが見当違いだとコメントされている。
理由は簡単で、ユーザー登録時にチェックするからだという。
逆に考えると、ユーザーアドレスの重複をある意味許す機構にしている場合は話が変わってくる。(が、その場合パスワード変更の扱いもこのチュートリアルとは変わってくる)
隠しフィールド
edit
のような get リクエスト時にはクエリパラメータなどで存在するため簡単に取り出せる情報をupdate
時にも欲しいことがある。そういった情報は画面上には表示しない input エレメントに保持する。
このようなユーザーには見えない(見せなくて良い)情報を保持する input を隠しフィールドと呼ぶ。
まとめ
ほとんど一つ前のアカウント有効化と同じような処理であっさり復習ができるような内容だった。
すっきりした内容ゆえに、コントローラーでパスワードリセットという操作を抽象化して全て記述していることを再認識しやすい。
パスワードリセットという操作文脈をモデリングしてコントローラーに記述、その振る舞いを統合テストに記述する。
ここで利用するデータは ActiveRecord を継承した User モデルが持っているので、User 属性に関する操作はそちらに記述する。
このような外枠を把握するのにすごくいい内容だと感じた。