使用ActiveRecord :: Serialization.to_xml构建动态字段

时间:2008-11-04 02:46:52

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

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

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

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

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

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

如果我在这里错了,请纠正我,但如果您必须访问该对象本身,那么在序列化一个或多个对象时,有什么可用的proc /块可用。

无论如何,请告诉我我是怎么错的,因为看起来我必须在这里忽略一些东西。

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

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

2 个答案:

答案 0 :(得分:1)

实际上,Proc传递给你传递给to_xml的相同选项hash(减去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相同的选项,这可以让你传递你需要的任何选项。

答案 1 :(得分:1)

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