web-dev-qa-db-ja.com

Railsでは、複数のチェックボックスを処理する方法、単に分割する、または?

ユーザーが複数のチェックボックス(同じ名前の値を持つ)をチェックし、コントローラーにポストバックされるときの状況を処理する「レールの方法」に興味があります。

複数のアイテムが選択され、ID値などで分割されているかどうかをどのように確認しますか?.

35
Blankman

これを行う最も簡単な方法は、これらのチェックボックスを設定して配列になることです。

HTML:

<input type="checkbox" name="tag_ids[]" value="1" />
<input type="checkbox" name="tag_ids[]" value="2" />
<input type="checkbox" name="tag_ids[]" value="3" />

コントローラ:

tag_ids = params[:tag_ids]

(もちろん、おそらくform_forベースのヘルパー、およびタグIDの一括割り当て。これは最も一般的な例です。)

56
Matchu
f.check_box :tag_ids, {multiple: true}, 1, nil

正しい答えです:

理由は次のとおりです。入力を配列に配置できる 'multiple:true'オプションがあります。 multiple:trueオプションがない場合、これは許可されません。

21
FlyingV

Chuck Callebsの答えに加えて、未チェックの値としてnilまたはfalseの代わりに空の文字列を送信すると、Railsは関連するIDを削除することを理解します更新アクションの場合:

<%= f.check_box :tag_ids, {multiple: true}, tag.id, '' %>

2
Roel4811

以下に、複数のクリーナーが複数の都市にいる場合のビューとコントローラーの例を示します。

<%= form_for(@cleaner) do |f| %>
  <p>
    <%= f.label :cities %><br />
    <% for city in City.all %>
      <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %>
      <%=h city.name %><br />
    <% end %>
  </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

そしてコントローラーで

def cleaner_params
  params.require(:cleaner).permit(city_ids: [])
end

これを行う「レールの方法」に関する完全なチュートリアルを見つけることができます https://kolosek.com/Rails-join-table/

1
Nesha Zoric