【Rails】formからハッシュの配列をパラメータとして送信する
最終的にcontrollerで受け取りたいparamsのイメージ
Railsのcontrollerで以下のような形式で同じname属性で固められた多次元配列をparamsとして受け取りたい
users: [
{
id: 10, name: "山田太郎", email: "test@email.com", phone_number: '024-111-11', memo: "役職:工場長",
action_histoires: [
{id: 10, action_datetime: "2022-05-13T00:00:00", description: "外出"},
{id: 20, action_datetime: "2022-05-13T00:00:00", description: "直帰"},
{id: nil, action_datetime: "2022-05-13T00:00:00", description: "時間休 13:00 - 15:00"},
],
},
{
id: 20, name: "山田太郎", email: "test@email.com", phone_number: '024-111-11', memo: "役職:工場長",
action_histoires: [
{id: 30, action_datetime: "2022-05-13T00:00:00", description: "外出"},
{id: nil, action_datetime: "2022-05-13T00:00:00", description: "直帰"},
{id: nil, action_datetime: "2022-05-13T00:00:00", description: "時間休 13:00 - 15:00"},
],
},
]
ハッシュ形式で送る
htmlのinputでname属性に user[name]
のように指定すると、指定したパラメーター名でハッシュが作成される。
(ブラケット内のワードをキー、inputに入力された値がバリューとなる)
Rails
<%= form.text_field 'user[name]' %>
<%= form.email_field 'user[email]' %>
form_withにモデルのインスタンスが指定されていれば以下と同義
<%= form_with(model: User.new, local: true) do |form| %>
<%= form.text_field :name %>
<%= form.email_field :email %>
<% end %>
form_withにmodelオプションが指定されている場合、formヘルパーの第一引数にモデルが持つ属性をシンボルで指定できる。このように指定した場合復元されたhtmlでは モデル名[属性名]
の形式のname属性がinputタグに自動でセットされる。
HTML
<input type="text" name="user[name]" value="山田太郎" >
<input type="email" name="user[email]" value="yamada@email.com" >
params
user => {
name: '山田太郎',
email: 'yamada@email.com'
}
配列形式で送る
htmlのinputでname属性に user[]
のように指定すると、同じnameを持つinput valueの配列が作成される。
Rails
<%= form.text_field 'user[]' %>
<%= form.email_field 'user[]' %>
HTML
<input type="text" name="user[]" value="山田太郎" >
<input type="email" name="user[]" value="yamada@email.com" >
params
user => ['山田太郎', 'yamada@email.com']
ハッシュの配列形式で送る
上記二つを合わせるイメージ。htmlのinputでname属性に users[][name]
のように指定すると、usersというキーに配列が作成されて、
その配列の中に複数のハッシュが内包される構造を作ることができる。
Rails
<%= form.text_field 'users[][name]' %>
<%= form.text_field 'users[][email]' %>
HTML
<input type="text" name="users[][name]" value="山田太郎" >
<input type="email" name="user[][email]" value="yamada@email.com" >
<input type="text" name="users[][name]" value="佐藤次郎" >
<input type="email" name="user[][email]" value="sato@email.com" >
params
users => [
{ '山田太郎', 'yamada@email.com' },
{ '佐藤次郎, 'sato@email.com' },
]