1

我被指派修复以前开发人员创建的代码中的一些问题。他将序列化的复选框值存储在数据库中,尽管这些值肯定会存储在所描述的表中,但当表单出现时,不会根据存储在数据库中的内容检查复选框。我假设我需要在表单知道应该选中哪些复选框之前取消序列化该数据。

有没有办法反序列化排除数据,以便以下代码能够将 true 分配给 check_box_tag 方法的选中属性?

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
      else
        checked = false
      end
      "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
    } %>
</p>
4

1 回答 1

0

我认为问题是范围问题;该checked变量仅存在于 的其中一个分支中,if一旦到达该变量就不再存在end。尝试这个:

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      checked = false
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
      end
      "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
    } %>
</p>

我只是删除了else分支并将值设置为false默认值。

如果仅在分支为真时才显示复选框,这可能会导致进一步的失败if——在这种情况下,请尝试以下操作:

<p><label for="supplemental_material_type_exclusions">Exclusions</label><br/>
<%= ApplicantBudgetlevel.find(:all).collect { |p|
      if @supplemental_material_type.exclusions
        checked = @supplemental_material_type.exclusions.include?(p.level)
        "#{check_box_tag('supplemental_material_type[exclusions][]', p.level, checked)} #{p.level} - #{p.range}<br />\n"
      end
    } %>
</p>

这两种方法中的哪一种是正确的取决于我无法从这里衡量的——但我会先尝试第一种,然后查看日志以查找新的或不同的错误或警告。

于 2012-04-19T00:18:42.047 回答