#Rails_tutorial 8章で出てきたform_forについてまとめた
Rails tutorial 7章や8章で出てきたform_forメソッドが省略されすぎててよくわからなかったので自分の為、はたまたここで躓いている方の参考になればとまとめてみました。
ここではRails tutorial 8章ででてきた
<%= form_for(:session,login_path)%>
について解説してみたいと思います。
このことを説明する前に、じゃあ
<%=form_for(@user)%>
は一体なんだったのかを説明したいと思います。
##form_for(@user)とは
<%=form_for (@user)%>
この@userにはusers_controllerで
def new
@user=User.new
end
で生成されたUserモデルのインスタンスが含まれています。
引用 https://www.pikawaka.com/rails/form_for
form_forの引数にはモデルクラスのインスタンスを指定します。
※()は省略可能です。
モデルクラスのインスタンスとは保存したいテーブルのクラスのインスタンスのことです。
モデルクラスのインスタンスをform_forに指定した場合、
Railsが自動でアクションを振り分けてくれます。
便利ですが、省略されるとかえって難しくなる時がありますよね。
つまりは
form_for(@user)
の記述により、
@userがnewメソッドで呼び出された場合は、
/users URL ('users#create')へのPOSTであると自動的に振り分けられる。
また、paramsで情報を確認すると
params
=>{'user' => {'name'=>'hoge'}}
のようにuserリソースの中にハッシュとしてパラメータが取り出せるようになっています。
userリソースをわざわざ手動で指定しなくても、モデルクラスのインスタンスの場合は自動で振り分けてくれるんですね!
この上で
form_for(:session,url:login_path)
についてみていきたいと思います。
##form_for(:session,url:login_path)とは
ひょっとしたらもうわかってしまったかもしれませんが、
sessionにパラメータを付与したいときに、
sessionにはモデルが存在しません。
なので@userのようなモデルクラスのインスタンスも作れないです。
こうなったら、自分でリソースとurlを指定しないとRailsは ’?’
ってなりますよね。なのでリソースである:sessionと 送信先を指定しました。
また、ここで決めたリソースの:sessionはなんでもいいです。
というのも、リソース名は結局paramsでパラメータを取得する際の名前に過ぎないからです。
例えば
<%=form_for(:sessionfuoaaaa,url:login_path)%>
としてもparamsの内容を見てみると
params
=>{sessionfuoaaaa:{name:'hoge'}}
のようになるだけだからです。
つまり
params[:sessionfuoaaaa][:name]
=>'hoge'
となります。
##まとめ
長くなりましたがまとめると以下です。
- form_forに渡す引数はモデルクラスのインスタンスの場合、自動的に振り分けられる。
- sessionにはモデルクラスがないため、手動で振り分ける必要がある。
- 手動で振り分けたときのリソース名はparamsで取得するハッシュのキーになる。
僕のように躓いた方の参考になれたら幸いです。