前半戦はこちらから
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章終了!