Rails 1.2.3反序列化数据

时间:2012-04-18 02:08:21

标签: ruby-on-rails serialization checkbox

我被分配来修复以前开发人员创建的代码中的一些内容。他将序列化的复选框值存储在数据库中,虽然这些值肯定存储在表格中,但是当表单出现时,不会根据存储在DB中的内容来检查复选框。我假设我需要在表单可以知道应该检查哪些复选框之前反序列化该数据。

有没有办法对排除数据进行反序列化,以便以下代码能够为check_box_tag方法的checked属性赋值true?

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

1 个答案:

答案 0 :(得分: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>

这两种方法中的哪一种是正确的取决于我可以从这里得到的更多 - 但我先尝试第一种方法,然后查看日志中的新错误或警告。