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