ユーザーが複数のチェックボックス(同じ名前の値を持つ)をチェックし、コントローラーにポストバックされるときの状況を処理する「レールの方法」に興味があります。
複数のアイテムが選択され、ID値などで分割されているかどうかをどのように確認しますか?.
これを行う最も簡単な方法は、これらのチェックボックスを設定して配列になることです。
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の一括割り当て。これは最も一般的な例です。)
f.check_box :tag_ids, {multiple: true}, 1, nil
正しい答えです:
理由は次のとおりです。入力を配列に配置できる 'multiple:true'オプションがあります。 multiple:trueオプションがない場合、これは許可されません。
Chuck Callebsの答えに加えて、未チェックの値としてnil
またはfalse
の代わりに空の文字列を送信すると、Railsは関連するIDを削除することを理解します更新アクションの場合:
<%= f.check_box :tag_ids, {multiple: true}, tag.id, '' %>
以下に、複数のクリーナーが複数の都市にいる場合のビューとコントローラーの例を示します。
<%= 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/