Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails:複数のForm項目の値を配列形式でコントローラーに渡す

Viewの項目の値を配列形式でparamsに設定し、Controllerで使用する方法をメモしておきますφ(..)

手順

前提

今回は、下記のように複数のレコードに設定したCheckBoxの値を配列形式で設定し、Controller側で処理するケースを想定してます。
さらに具体的にいうと、スケジュールが設定されたレコードが複数あって、それに対してそれぞれCheckBoxで承認していく仕様を実装していきます。

f:id:madogiwa0124:20171231212613p:plain

手順

まず、複数のフォーム項目を配列形式でparamsに設定するには下記の形式でView側に記載します。ポイントは、要素名を要素名[]のように設定することです。

<%= tag_name 'hoge[]' %>

今回はForm内にある複数のCheckBoxの値を配列で渡すので、Viewの実装は下記のようになります。

<%= form_tag approve_interviews_path, { method: :put } do %>
<table border='1'style="border-collapse:collapse">
  <thead>
    <tr>
      <% if params[:action] = 'select' %>
        <th>Approve</th>
      <% end %>
      <th>Title</th>
      <th>Schedule</th>
      <th>User</th>
    </tr>
  </thead>
  <tbody>
    <% @interviews.each do |interview| %>
      <tr>
        <% # 配列 approved にinterview.idを追加 %>
        <td><%= check_box_tag('approved[]', interview.id)%></td>
        <td><%= interview.title %></td>
        <td><%= format_datetime_string interview.schedule %></td>
        <td><%= interview.user.user_name %></td>
      </tr>
    <% end %>
  </tbody>
</table>
<%= submit_tag :approved %>
<% end %>

Contollerで下記のように配列形式で受け取ることが出来ます。

  def approve
    @interviews = Interview.where("id in (?)", params[:approved])
    @interviews.each do |interview|
      interview.status = Interview::statuses[:approved]
      interview.save
    end
    redirect_to interviews_path
  end

参考

check_box - リファレンス - - Railsドキュメント

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