如果没有选中,如何更新复选框?

时间:2012-12-03 02:00:03

标签: ruby sinatra erb

我有一些复选框,他们的名字映射到我的activerecord模型中的一列。问题是,当选择了checbox时,它们出现在Sinatra的params数组中,工作正常。但是当它们被取消选择时,参数永远不会包含:checkbox =>假。它只包含:checkbox =>真正。因此,用户可以从取消选择转到选择,但从不反过来,因为params散列为:checkbox =>假从未通过。

我觉得我在这里缺少一些基本的东西。请帮忙。 感谢

2 个答案:

答案 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