我有一些复选框,他们的名字映射到我的activerecord模型中的一列。问题是,当选择了checbox时,它们出现在Sinatra的params数组中,工作正常。但是当它们被取消选择时,参数永远不会包含:checkbox =>假。它只包含:checkbox =>真正。因此,用户可以从取消选择转到选择,但从不反过来,因为params散列为:checkbox =>假从未通过。
我觉得我在这里缺少一些基本的东西。请帮忙。 感谢
答案 0 :(得分:4)
A control in a HTML form only gets submitted to the server if it is “successful’。对于复选框,这意味着它已被选中。未选中的复选框未提交。这意味着在Sinatra中params[:the_checkbox]
的值是HTML中指定的复选框的值(如果你没有指定一个值,这将是默认值,即字符串'on'
),如果它已经过检查,或者nil
,因为没有提交任何内容。
显而易见的解决方案是明确检查nil
,然后假设在这种情况下取消选中该复选框:
checkbox_value = params[:the_checkbox].nil? ? false : true
另一个选择是利用name/value pairs of the form data are sent to the server in the order that they appear in the document的事实,并且当Sinatra在解析数据时看到重复的名称时,它将覆盖较早的值。这意味着您可以在HTML中执行以下操作:
<input type='hidden' name='the_checkbox' value='false' />
<input type='checkbox' name='the_checkbox' value='true' />
现在,如果未选中该复选框,则不会提交,但隐藏的输入将会被提交,如果已选中则会提交,但隐藏输入后会显示一样的名字。结果是params[:the_checkbox]
如果已经检查则为'true'
字符串,如果没有则为'false'
字符串。 (请注意,您可能仍需要将字符串转换为布尔值,具体取决于您对提交的数据所做的操作)。
答案 1 :(得分:0)
你可以这样做:
post '/your-route' do
params[:checkbox] ||= false
# now do whatever you want with params[:checkbox]
end
这样做会将false
分配给params[:checkbox]
,除非它已经定义并设置为true
。