【问题标题】:Building dynamic fields using ActiveRecord::Serialization.to_xml使用 ActiveRecord::Serialization.to_xml 构建动态字段
【发布时间】:2010-09-20 14:43:35
【问题描述】:

我很好奇人们使用 AR 的 to_xml() 从控制器构建非实体字段的体验(例如,不是您正在序列化的模型的属性,但可能是利用过程中的属性)。

to_xml 似乎为此提供了一些选项。

一种是通过传入对正在操作的对象上的方法的引用:在序列化过程中,这些方法被调用并将它们的结果添加到生成的文档中。我想避免这条路径,因为某些生成的数据虽然取决于对象的属性,但可能超出模型本身的范围——例如,构建特定项目“显示”操作的 URL。另外,它需要太多的深谋远虑。我希望能够通过调整控制器中的 to_xml 代码来更改结果文档。我也不想在对象中声明一个方法的麻烦。

在每个对象中覆盖 to_xml 也是如此。

另外两个选项似乎更符合要求:一个是通过在生成这些字段的序列化选项中传递 procs,另一个是通过传递一个在序列化对象属性后将产生的块。这些提供了我正在寻找的那种调用点自定义,此外,它们的声明将范围绑定到控制器,以便它们可以访问与控制器相同的东西,但是这些方法似乎受到严重限制:AFAICT 它们不包含对正在序列化的对象的引用。它们包含对构建器对象的引用,当然我猜你可以在块/过程中解析并找到已经序列化的属性并使用它们,但这是一种长篇大论,或者至少是不安和次优的。

如果我在这里错了,请纠正我,但是如果您必须访问对象本身,那么在序列化一个或多个对象时使用 procs/blocks 有什么意义。

无论如何,请告诉我我哪里错了,因为我似乎在这里忽略了一些东西。

哦,是的,我知道我可以写出自己的观点。我正在尝试利用 respond_to 和 to_xml 来实现最少的额外文件/行。 (不过,当我无法弄清楚如何使用 AR 的序列化来做到这一点时,我就采用了这种方法。)

**EDIT 3.29.09 -- 我刚刚向 Rails 提交了一个补丁。如果您有兴趣,请提供一些支持:) https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2373-record-sensitive-procs-for-to_xml

【问题讨论】:

    标签: ruby-on-rails xml ruby serialization activerecord


    【解决方案1】:

    实际上,Proc 传递了与传递给 to_xml 相同的选项哈希(减去 procs 选项)。因此,您可以传入 Proc 完成工作所需的任何额外对象:

    proc = Proc.new {|options| options[:builder].tag!('reverse-name', options[:object].name.reverse)}
    object.to_xml :object => object, :procs => [ proc ]
    

    由于您获得的 proc 获得的选项与 to_xml 相同,因此您可以传入所需的任何选项。

    【讨论】:

    • 因此,在您的示例中,“object”是您正在使用的额外 k/v 对,它将传递给每个序列化调用和 proc。那挺好的。它当然创造了可能性。挑战仍然存在:您将如何在阵列上执行此操作?将数组作为额外的 k/v 传递并串联迭代? ://
    【解决方案2】:

    哇!我处理这种情况的补丁被接受了:http://github.com/rails/rails/commit/c39151a84768397d3bb025c6e8f877eac59ebbf9 它现在是 ActiveModel 的一部分,我不确定它的发布时间表是什么;我在考虑 Rails 3。

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2012-01-29
      • 2016-07-28
      • 2017-08-07
      相关资源
      最近更新 更多