Ruby on Railsでよく使うform_withですが、初めて見た時に何が書いてあるのかさっぱり分かりませんでした。
今は書いてあることが少しわかるようになったのでその備忘録です。
実行環境: Ruby on Rails 6.0
まずは簡単なフォームの例
例えばnewアクションに対応したviewである new.html.erbでよく見かけるこんな例文があります。
<%= form_with model: @user, url: users_path do |f| %>
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true, autocomplete: "name" %>
<%= f.submit "登録" %>
<% end %>
これは入力ボックスが一つだけ付いたフォームです。
RubyとRuby on Railsに慣れていないとこれがRubyの文法として正しいのか分かりませんよね。
これはもう少し変形してみると分かりやすくなります。
フォームを分かりやすく変形する
<% %>は.erbの中でrubyの文を書く時に必要な物になります。まずは見やすくするために<% %>をはずします。
form_with model: @user, url: users_path do |f|
f.label :name
f.text_field :name, autofocus: true, autocomplete: "name"
f.submit "登録"
end
まだ見にくいですね。
rubyは()が省略可能です。次は省略されている()を戻してみます。
form_with( model: @user, url: users_path ) do |f|
f.label( :name )
f.text_field( :name, autofocus: true, autocomplete: "name" )
end
これで少しはやっていることのイメージがしやすくなったかと思います。
form_withというメソッドを呼んでいたということです。そして、form_withの後ろに書かれていた
model: @user, url: users_path
これらは引数だったということです。
form_withの引数の書き方について
次はform_withの引数についてです。
form_withは2つの引数がありますが、変わった書き方をしています。
model: @user
url: users_path
この書き方の意味が分かりませんよね。
これは挿入先を指定した引数です。
rubyはどの引数にどんな値を入れるのかを指定することができます。
def add(arg1:, arg2:)
p "arg1=#{arg1}"
p "arg2=#{arg2}"
end
def test
add(arg2:50, arg1:100)
end
# ------- 結果
"arg1=100"
"arg2=50"
この例のaddメソッドの呼び出し方と同じです。
この場合、順番に関係なく、arg1に100、arg2に50が入ります。
form_withの例に話を戻します。
model: @user
url: users_path
この2つは modelという引数に@userを、urlという引数にusers_pathを入れていることになります。
引数は普通なら順番通りに入れないとだめですが、挿入先を指定することで順番を意識することなく引数に値を入れることができるようになります。
uses_pathは何?
次に疑問に思うのが、users_pathですよね。
パスというと、http://xxxx.com みたいな形式ですが、
users_pathとはどこで定義されていて、どこのurlにリンクされているのでしょうか?
これはプリフィックスと呼ばれるもので、以下の記事に書いています。
こちらもぜひ参考にしてください。
まとめ
ここまで来ると何をしているかわかったのではないかと思います。
<%= form_with model: @user, url: users_path do |f| %>
<%= f.label :name %><br />
<%= f.text_field :name, autofocus: true, autocomplete: "name" %>
<%= f.submit "登録" %>
<% end %>
まずはform_withメソッドでhtmlのformタグを出力します。
次にlabelメソッドでhtmlのタグを出力。
次にtext_fieldメソッドでhtmlのテキストボックスのタグを出力。
sumitメソッドでhtmlの登録ボタンを出力しているということです。
rubyの省略表記は便利だけど、初心者には分かりにくいですね…