テックアカデミー第4回メンタリングの体験レポート:form_forて何やってるの?引数と遷移先の話

2018年3月18日

さて、今日は講師(メンター)との、ビデオ通話面談(メンタリング)の日です。実は前回からあまり進んでおりません。風邪をひいてサボッてしまったのです。しかしメンタリングは充実した時間となり、Railsの理解をさらに深める事ができました。

現在の進捗の報告

現在受講期間の1/3が終わり、テックアカデミーでは全14レッスン中の12まで進んできました。実際にTwitterクローンの作成まで進み、だんだん難しくなってきたことを感じています。ここからが時間がかかりそうです。

またレッスン中の文章を読み進めてはAWSのCloud9という開発環境上でコードを記述し動きを確認しながら実装しているのですが、レッスンの中身を理解しながら先に進まないといけないなと感じています。

プログラミングのコードサンプルが掲載されているので、それをコピペしていけば同じ出力結果が得られるわけですが。1つのメソッドでも不明のまま先に進むことはできるのですが、それをしてしまうと不明点が重なっていき、訳がわからない状態に‥

なのでたった1つのコードでも「何この動き?」「さっきと違う使い方してる」とか思ったらその都度解消しながら進めているのでなかなか進捗が遅くなってきました。

理解を深めたform_forの引数と遷移先

さて、今日はテックアカデミー第4回目のメンタリングで学習した事をレポートしていきます。

それがこちら。

<%= form_for(:session, url: login_path) do |f| %>

form_forというメソッドは、HTML側にformタグを出力するメソッドです。
メッセージ投稿画面とか、お問い合わせページとか、プロフィール登録画面とか、そういう所で使うメソッドです。

いままでform_forの引数は1つだったのですが、例えばこんな感じで

<%= form_for(@person) do |f| %>

今回は引数が :sessionと、 url: login_path の2つです。ブラウザで出力してソースを出してみるとどんなHTMLソースを吐き出しているかは見れます。

<form action="/login" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="&#x2713;" />
<input type="hidden" name="authenticity_token" value="ZaxuJ8PwOCvwX/FpACj/eaAwg3b72chhi/Trk8hm7EgmbW7+5Gy6AMhoAnmyknKTwsH1fuyyTfG/RxGzoWJl5w==" />

ここでいくつかの疑問が。

そもそもRailsではフォームタグの飛び先をどのように解釈しているのか?

今回はこれを確認させていただきました。

先生の話を整理すると以下のような事が理解できてきました。

引数にインスタンスが入ってる場合

form_forの引数(この場合は@persionとか:sessionとか)にインスタンスが入ってる場合は、インスタンスの状態によって何のHTTPメソッドで送信するというのが決定される。

例えばnewアクション(新規作成とか新規投稿とか)だと、form_forの引数に入ってくるインスタンスは保存されていないレコードなので、URLとHTTPメソッド(POSTとか)が決定されるので→ルーティングに従ってcreateアクションに遷移します。

edit(更新画面)の場合は既に保存済のインスタンスなので、HTTPメソッド(PUT)でupdateアクションに遷移する。

インスタンスがない場合

最初の例のform_forへ2つ引数を入れている

<%= form_for(:session, url: login_path) do |f| %>

の場合は、:sessionがインスタンスがないので送信先をどこにするのかを指定する必要がある。

今まではインスタンスの状態でPOSTかPUTか選択できたけど、シンボルの場合はインスタンスではなく欠落しているので送信先を指定する必要がある。

なので第2引数でurl: login_pathを渡している。

login_pathはルーティングにしたがって、

login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create

loginというURLへ、HTTPメソッドPOSTで遷移していきます。という事はsessions#createアクションに行くことになる。

と、ここまで理解を進める事ができました。

Railsって難しいのぅ。裏で自動的に配慮して(?)いろいろやってくれる‥というのが個人的には難解になるんだよなぁ。他の人はそうではないみたいだけど。

もう受講期間の3分の1も過ぎてしまった。なんとか食らいついていかねば!