我有一个带有列的设置模型options,并将其设置为使用serialize :options. 在我看来,我有一个多选框,select("settings", "options", ['option1','option2','option3'], {}, :multiple => true)只要用户选择至少一个选项,它就可以正常使用。但是,如果他们没有选择任何选项,则不会提交任何选项,因此不会更新选项。
如何允许用户从 Rails 中的多选框中选择零选项?
我有一个带有列的设置模型options,并将其设置为使用serialize :options. 在我看来,我有一个多选框,select("settings", "options", ['option1','option2','option3'], {}, :multiple => true)只要用户选择至少一个选项,它就可以正常使用。但是,如果他们没有选择任何选项,则不会提交任何选项,因此不会更新选项。
如何允许用户从 Rails 中的多选框中选择零选项?
这与 rails 无关:如果在“选择”元素中未选择任何内容,则 html 表单不会将此类参数发送到服务器。但是你应该能够在控制器中修复它。像这样的东西
if params[:settings] == nil
params[:settings] = [];
end
不确定是否有更优雅的解决方案。
在选择框后添加一个隐藏字段,将一个空值发布到“设置 [选项]”
Rails 使用相同的技巧来确保未选中的复选框被发布为假。
如果未发布属性,我不喜欢假设值为空。它打破了 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="" />')
});
我意识到这个答案不是很及时,但我希望这会对有类似问题的人有所帮助。
您可以提供“无”选项。
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>