我有一些复选框,它们的名称映射到我的 activerecord 模型中的列。问题是,当复选框被选中时,它们会出现在 Sinatra 的 params 数组中,效果很好。但是当它们被取消选择时,参数永远不会包含:checkbox => false。它只包含 :checkbox => true。因此,用户可以从取消选择变为选中,但反之亦然,因为 :checkbox => false 的参数哈希永远不会传递。
我觉得我在这里缺少一些基本的东西。请帮忙。谢谢
显而易见的解决方案是显式检查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'
你可以做这样的事情:
post '/your-route' do
params[:checkbox] ||= false
# now do whatever you want with params[:checkbox]
end
除非它已经定义并设置为,否则它的作用是分配false
给。params[:checkbox]
true