LoginSignup
4
3

More than 3 years have passed since last update.

Rails_tutorial 8章で出てきたform_forについて

Posted at

Rails_tutorial 8章で出てきたform_forについてまとめた

Rails tutorial 7章や8章で出てきたform_forメソッドが省略されすぎててよくわからなかったので自分の為、はたまたここで躓いている方の参考になればとまとめてみました。

ここではRails tutorial 8章ででてきた

sessions/new.html.erb
<%= form_for(:session,login_path)%>

について解説してみたいと思います。

このことを説明する前に、じゃあ

<%=form_for(@user)%>

は一体なんだったのかを説明したいと思います。

form_for(@user)とは

<%=form_for (@user)%>

この@userにはusers_controllerで

users_controller.rb
def new
  @user=User.new
end

で生成されたUserモデルのインスタンスが含まれています。

引用 https://www.pikawaka.com/rails/form_for

form_forの引数にはモデルクラスのインスタンスを指定します。
※()は省略可能です。
モデルクラスのインスタンスとは保存したいテーブルのクラスのインスタンスのことです。

モデルクラスのインスタンスをform_forに指定した場合、
Railsが自動でアクションを振り分けてくれます。

  • @userがnewメソッドで生成されたインスタンスの時

    • createアクションに振り分け
  • @userがfindメソッドなどで生成されたインスタンスの時

    • updateアクションに振り分け 

便利ですが、省略されるとかえって難しくなる時がありますよね。

つまりは

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に渡す引数はモデルクラスのインスタンスの場合、自動的に振り分けられる。
    • @user=User.newの場合→createアクション
    • @user=User.findの場合→updateアクション
  • sessionにはモデルクラスがないため、手動で振り分ける必要がある。
  • 手動で振り分けたときのリソース名はparamsで取得するハッシュのキーになる。

僕のように躓いた方の参考になれたら幸いです。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3