Progateを卒業してRuby on Railsチュートリアルやります 後半戦


前半戦はこちらから

Progateを卒業し、Railsチュートリアルに挑戦しています。
Railsチュートリアルを進めていくときにつまづいたところ、勉強になった所をまとめていきます。

第12章

演習課題
リスト 12.4のform_forメソッドでは、なぜ@password_resetではなく:password_resetを使っているのでしょうか? 考えてみてください。

この問題に対する答えをぐぐってみたのですが納得できる回答はありませんでした。
必死こいて考え抜いてたので備忘録を残しておきます。

まず、form_forにシンボル(例えば:user)を渡すときと、オブジェクト(例えば@user)を渡すときの違いから。
ググるとこんな回答が得られました↓

シンボルを使うとよりシンプルなformタグが生成され、オブジェクトを渡すとそのオブジェクトに寄って良しなに出し分けてくれる。newやeditのviewを準備する時に、同じ_form部分テンプレートを利用した時、同じ書き方で出し分けてくれる。
(参考:http://ja.stackoverflow.com/questions/18099/rails%E3%81%AEform-for%E3%81%AB%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%81%A8%E3%81%8D%E3%81%8B)

これが演習問題の回答です!
としている記事もありましたが、不十分すぎて納得できず…。
ちゃんとチュートリアルの実装に合わせて回答を考えてみました。

前提として、今回の章で作る「新しいパスワード再設定画面ビュー」app/views/password_reset/newは他のビューファイルへ使いまわしません。
なので、form_forで生成されるHTMLのactionを出し分ける必要はありません。

一方、ビューファイルを使い回したこともありました。部分テンプレートとして共通のHTMLを切り出したときとかです。app/views/users/_form.html.erbは部分テンプレートとして使い回されるビューファイルです。form_forの引数には@userが渡されています。
@userにUser.newがはいったり、User.find_by(:id)が入ったりします。@userにUser.newが入っていたらusers#createにルーティング送ってほしいし、@userにUser.find_by(:id)がはいっていたらusers#editに送ってほしいよね。
@userの状態によってactionを出し分けてほしいのでform_forの後を@userとしていたんですね。

演題の回答は以下になります。
新しいパスワード再設定画面ビューは部分テンプレートではないので、form_forでHTMLのaction属性を出し分ける必要がありません。
form_forの後はシンボル:password_resetとするのが最適のコーディングになります。

2018.10月 追記

後半戦のまとめは14章終わってからやることにしました。
息切れがひどく、まとめるよりも進めることに注力していきます。
ホントは気づいたこととかかければいいんでしょうが…!

現在10章終了!