5

列を持つ設定モデルがあり、optionsでシリアル化するように設定していserialize :optionsます。私の見解ではselect("settings", "options", ['option1','option2','option3'], {}, :multiple => true)、ユーザーが少なくとも 1 つのオプションを選択する限り、複数の選択ボックスを使用して問題なく動作します。ただし、オプションを選択しない場合、オプションは送信されないため、オプションは更新されません。

ユーザーがレールの複数選択ボックスからゼロオプションを選択できるようにするにはどうすればよいですか?

4

4 に答える 4

4

それはレールとは関係ありません。「select」要素で何も選択されていない場合、htmlフォームはそのようなパラメーターをサーバーに送信しません。ただし、コントローラーで修正できるはずです。このようなもの

if params[:settings] == nil
  params[:settings] = [];
end

よりエレガントなソリューションがあるかどうかはわかりません。

于 2010-07-29T15:16:05.793 に答える
4

選択ボックスの後に非表示フィールドを追加し、空の値を「settings[options]」に投稿します

チェックされていないチェックボックスがfalseとして投稿されるようにするためにレールが使用するのと同じトリックです。

于 2010-07-29T15:17:24.733 に答える
2

属性が投稿されていない場合、値が空であると想定するのは好きではありません。これは、Rails が期待する属性の更新方法を壊し、HTML だけでなく API にもコントローラー アクションを使用している場合に問題を引き起こす可能性があります。これを処理する私の好みの方法は、複数選択の前に非表示の入力フィールドを追加することです。

<input type="hidden" value="" name="parent_model[my_attribute_ids][]">

JQuery を使用すると、これらの隠し入力フィールドの追加を自動化できます。

$('select[multiple="multiple"]').each(function(i){
    $(this).before('<input type="hidden" name="'+this.name+'" value="" />')
});

この回答はあまりタイムリーではないことは承知していますが、これが同様の質問を持つ人に役立つことを願っています.

于 2012-01-25T18:20:09.140 に答える
1

「なし」オプションを指定できます。

例: http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'}, {:multiple => true})

なるだろう

<select name="post[person_id]" multiple="multiple">
  <option value="">None</option>
  <option value="1">David</option>
  <option value="2" selected="selected">Sam</option>
  <option value="3">Tobias</option>
</select>
于 2010-07-29T15:29:30.550 に答える