【问题标题】:Rails 1.2.3 Unserializing dataRails 1.2.3 反序列化数据
【发布时间】:2012-04-18 02:08:21
【问题描述】:

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

有没有办法反序列化排除数据,以便以下代码能够将 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>

【问题讨论】:

  • 他使用的序列化是作为模型中的指令执行的。所以我不相信这是一部自制的连载。
  • 你现在得到什么样的输出?
  • 好吧,所有的复选框都显示为它们应有的尊重标签。唯一错误的是,最初检查的序列化值没有显示为使用上面发布的代码进行检查。我怀疑这是因为这些值是序列化的,我需要对它们进行反序列化,以便 if 条件可以确定应该检查什么,不应该检查什么。

标签: ruby-on-rails serialization checkbox


【解决方案1】:

我认为问题在于范围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>

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

【讨论】:

  • 嗨,萨诺德。感谢您的出色建议。您的第一个示例将起作用,因为复选框必须始终出现。我想我现在看到了根本原因。序列化的数据是问题的一半。另一半是模型中的序列化调用将数据库中“Level 1”的复选框值转换为“Level%25201”。我相当有信心 if 条件永远不会成立,因为双空格永远不会与单个空格匹配。为了上述显示逻辑,这可以不编码吗?
  • 我感觉您应该在 model 中正确地进行序列化/反序列化,并尝试通过此修复不理会视图代码。如果您需要将模型中的序列化代码更改为更容易可逆的代码,这听起来很值得。
  • 再次感谢萨诺德。我想这就是神奇的问题。我对 Rails 不是很好,所以我不完全确定我对这个最新建议的选择是什么。我同意你的看法。我只是不确定我将如何做到这一点,因为序列化似乎是一种 ActiveRecord 方法,但文档没有显示如何操作序列化的发生方式等,而且我也没有看到明显的反序列化方法。有什么建议吗?
  • 哦,hrm,通常您不需要为 Just Work 的 serialize 指令执行任何操作
  • 那么,为什么 Rails 使用 %2520 而不是 %20?我什至无法理解为什么这样做有意义,因为它显然与单个空间不同,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多