【RubyonRails】f.text_fieldで、配列をparamsに格納してコントローラーに送れるようにする

 

ちょっとしたRailsのネタを書きます。

大したことではないのですが、結構ハマってしまったので。

 

モデルに関連づいたフォームを作成するときには、form_forを使います。

その中でf.text_fieldを使って、入力された値を配列としてparamsに入れて、

コントローラに送りたいといった場合があるかと思います。

 

例えば、Dairyテーブルのtagカラムに、

フォーム画面で入力されたタグを5つ配列で格納したいとします。

 

まず、models/dairy.rbに下記の記述をします。

 

class Dairy < ActiveRecord::Base

serialize :tag

end

 

serializeを記述することで、tagカラムに配列を格納できるようになります。

そして、フォームを表示するテンプレートファイルには、

一例ですが下記のように記述します。

 

<%= form_for(dairy, url: dairy_index_path, html: {method: :post}) do |f| %>

<% if dairy.errors.any? %>

<% dairy.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>

<% end %>

<label>
<%= f.text_field :title, maxlength: 100, placeholder: “タイトル(最大100文字)” %>
</label>

<label>
<% i=0 %>
<% while i<5 do %>
<%= f.text_field :tag, name:”dairy[tag][]”, maxlength: 20, placeholder: “タグ#{i+1}(最大20文字)” %>
<% i+=1 %>
<% end %>

</label>

<%= f.submit ‘投稿する!’, data: { confirm: ‘この内容で投稿しますか?’} %>

<% end %>

 

上の記述では、タグの入力フォームが5つ表示され、

タグを入力して投稿ボタンを押すと、

入力されたタグが配列としてparamsに格納され、

コントローラー側に渡されます。

赤字の部分のように、name属性を明示的に記述するところがポイントです。

name属性に空の[]を記述すると配列がparamsに格納されるのですが、

f.text_field: tag[]のように記述するとargument errorが返ってきます。

f.text_fieldは自動でname属性を作成しますが、それがアダとなっているようです。

 

5つのタグ入力フォームにそれぞれ「あ」「い」「う」「え」「お」

という値を入力してフォーム送信すれば、配列がparamsに格納され、

コントローラー側ではparams[:dairy][:tag][0]で「あ」、

params[:dairy][:tag][1]で「い」、、というように値を取り出せます。

 

コントローラー側では、例えば下記のように記述して、

Dairyテーブルにフォームから送信されてきた値を保存できます。

 

class DairyController < ApplicationController

def create

@newdairy = Dairy.create(dairy_params)

private
def dairy_params
params.require(:dairy).permit(:title, tag:[])
end

 

赤字のように記述すると、[:tag][]というキーを持った値を受け入れる、

という意味になります。

以上で、f.text_fieldを使用した場合であっても、

フォームに入力した値を配列としてparamsに格納して、

データベースに保存することができるようになりました!

 

参考にしたサイトは下記です。(teratailにある質問は私がしたものです。。)

 

Rails4でserializeしてデータをDBに保存させる

Rails のフォームで配列形式のデータを扱う方法

パラメータの取得

Rails】f.text_fieldを使って配列をparamsに送りたい

 

以上です!

振り返ると全然大したことないのですが、ハマってしまったので皆様のお役に立てれば。

記事が気に入ったらシェア!

コメントを残す