如何允许用户从rails中的多选框中选择零选项?

时间:2010-07-29 15:05:19

标签: ruby-on-rails ruby multiple-select

我有一个包含options列的设置模型,并将其设置为使用serialize :options序列化。在我看来,我有一个多选框,使用select("settings", "options", ['option1','option2','option3'], {}, :multiple => true)只要用户选择至少一个选项就可以正常工作。但是,如果他们没有选择任何选项,则不会提交任何选项,因此不会更新选项。

如何让用户从rails中的多选框中选择零选项?

4 个答案:

答案 0 :(得分:4)

这与rails无关:如果在'select'元素中没有选择任何内容,html表单将不会将此参数发送到服务器。但是你应该能够在控制器中修复它。像这样的东西

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

不确定是否有更优雅的解决方案。

答案 1 :(得分:4)

在选择框后面添加一个隐藏字段,将空值发布到“settings [options]”

这与rails用来确保未经检查的复选框被发布为false的技巧相同。

答案 2 :(得分:2)

如果未发布属性,我不喜欢假设值为空。它打破了Rails期望更新属性的方式,如果您对API和HTML也使用控制器操作,则会出现问题。我首选的处理方法是在多选之前添加一个隐藏的输入字段。

<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="" />')
});

我意识到这个答案不是很及时,但我希望这可以帮助有类似问题的人。

答案 3 :(得分: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>