Rails form_tagとform_forの使い方と、それぞれの違いについて解説します。
form_tag の使い方
// routes.rb
post 'dev/index'
get 'dev/form'
// form.html.erb
<%= form_tag('/dev/index', method: :post) do %>
<%= text_field_tag :name %>
<%= text_area_tag :content %>
<%= submit_tag("submit") %>
<% end %>
// index.html.erb
<%= params[:name] %>
- routes.rb について
ポスト先を設定するのが肝です。
今回は dev/index に対してデータをポストしたいので、それをpost
と書き換えます。
- form.html.erb について
form_tagメソッドの第一引数には、ポスト先を記述します。
第二引数以降はオプションで、ここでは書いていませんが、フォームにCLASSやIDを割り当てたりできます。
method:
はデフォルトなので、別に書かなくても平気です。
- index.html.erb について
form_tagは、params[:name]で取得できますが、
form_forは、params[:userinfo][:name]のようになります。
form_for の使い方
// routes.rb
post 'dev/index'
get 'dev/form'
// dev_controller.rb
def form
@userinfo = Userinfo.new
end
// form.html.erb
<%= form_for(@userinfo , url: dev_index_path) do |f| %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
// index.html.erb
<%= params[:userinfo][:name] %>
- dev_controller.rb について
ここで僕はちょっとハマったのですが。どのサイトでも紹介してなかったりで。気をつけないといけないポイントです。
これを書いてインスタンス変数にモデルを定義した上で、次の、form.html.erbのform_forメソッドで使用するわけなので。
これ書いてないとハマります。
- form.html.erb について
form_forメソッドの第一引数には、定義したモデルのインスタンス変数を書きます。
オプションであるurl
ですが、これはどういうことかというと、form_forは、デフォルトではsubmit
を押してポストされる先が、#create
と決まっています。なので、g scaffold
とかしていないで、createがないよーって場合、エラーになります。
そういう時は、自分で任意のURLに飛ばすことができます。
これ例では、dev_index_pathとしていますが、これは、”名前付きルート”というみたいです。意味は、/dev/index
と同様の意味です。
- index.html.erb について
前述の通り、form_tagとparamsへの格納の仕方が違うので、取り出し方に注意が必要です。