我被分配来修复以前开发人员创建的代码中的一些内容。他将序列化的复选框值存储在数据库中,虽然这些值肯定存储在表格中,但是当表单出现时,不会根据存储在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>
答案 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>
这两种方法中的哪一种是正确的取决于我可以从这里得到的更多 - 但我先尝试第一种方法,然后查看日志中的新错误或警告。