1

我有一些复选框,它们的名称映射到我的 activerecord 模型中的列。问题是,当复选框被选中时,它们会出现在 Sinatra 的 params 数组中,效果很好。但是当它们被取消选择时,参数永远不会包含:checkbox => false。它只包含 :checkbox => true。因此,用户可以从取消选择变为选中,但反之亦然,因为 :checkbox => false 的参数哈希永远不会传递。

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

4

2 回答 2

4

HTML 表单中的控件只有在“成功”时才会提交给服务器</a>。对于复选框,这意味着它已被选中。未选中的复选框不会被提交。这意味着在 Sinatra 中,如果它被选中,则params[:the_checkbox]value 要么是 HTML 中指定的复选框的值(如果你没有指定一个值,这将是默认值,即 string ),或者因为什么都没有已提交。'on'nil

显而易见的解决方案是显式检查nil,然后假设在这种情况下未选中复选框:

checkbox_value = params[:the_checkbox].nil? ? false : true

另一种选择是利用表单数据的名称/值对按照它们在文档中出现的顺序发送到服务器的事实,并且当 Sinatra 在解析数据时看到重复的名称时,它将覆盖较早的值与较晚的值。这意味着您可以在 HTML 中执行以下操作:

<input type='hidden' name='the_checkbox' value='false' />
<input type='checkbox' name='the_checkbox' value='true' />

现在,如果未选中复选框,它将不会被提交,但隐藏的输入将被提交,如果选中,它将被提交,但将出现具有相同名称的隐藏输入之后。结果是,如果已检查,则为params[:the_checkbox]字符串,如果未检查,则为字符串。(请注意,您可能仍需要将字符串转换为布尔值,具体取决于您对提交的数据所做的操作)。'true''false'

于 2012-12-03T21:18:37.337 回答
0

你可以做这样的事情:

post '/your-route' do
  params[:checkbox] ||= false

  # now do whatever you want with params[:checkbox]
end

除非它已经定义并设置为,否则它的作用是分配false给。params[:checkbox]true

于 2012-12-03T19:47:51.533 回答