【问题标题】:How to update checkbox if not selected?如果未选中,如何更新复选框?
【发布时间】:2012-11-20 12:00:39
【问题描述】:

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

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

【问题讨论】:

标签: ruby sinatra erb


【解决方案1】:

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'。 (请注意,您可能仍需要将字符串转换为布尔值,具体取决于您对提交的数据所做的操作)。

【讨论】:

    【解决方案2】:

    你可以这样做:

    post '/your-route' do
      params[:checkbox] ||= false
    
      # now do whatever you want with params[:checkbox]
    end
    

    这会将false 分配给params[:checkbox],除非它已经定义并设置为true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2016-01-11
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多