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

Ruby on rails 使用ActiveRecord::Serialization.to_xml构建动态字段,ruby-on-rails,xml,ruby,serialization,activerecord,Ruby On Rails,Xml,Ruby,Serialization,Activerecord,我很好奇人们使用AR's to_xml()从控制器构建非实体字段(例如,不是序列化模型的属性,而是可能利用过程中的属性)的经历 to_xml似乎提供了一些这样做的选项 一种是通过传递对所操作对象上的方法的引用:在序列化过程中,调用这些方法并将其结果添加到生成的文档中。我希望避免使用此路径,因为生成的某些数据(取决于对象的属性)可能超出模型本身的范围,例如,构建指向特定项“显示”操作的URL。此外,这需要太多的先见之明。我只想通过调整控制器中的to_xml代码来更改结果文档。我也不想在对象中声明方

我很好奇人们使用AR's to_xml()从控制器构建非实体字段(例如,不是序列化模型的属性,而是可能利用过程中的属性)的经历

to_xml似乎提供了一些这样做的选项

一种是通过传递对所操作对象上的方法的引用:在序列化过程中,调用这些方法并将其结果添加到生成的文档中。我希望避免使用此路径,因为生成的某些数据(取决于对象的属性)可能超出模型本身的范围,例如,构建指向特定项“显示”操作的URL。此外,这需要太多的先见之明。我只想通过调整控制器中的to_xml代码来更改结果文档。我也不想在对象中声明方法的麻烦

在每个对象中重写为xml也是如此

其他两个选项似乎更适合这一要求:一个是通过在生成这些字段的序列化选项中传递proc,另一个是通过在序列化对象属性后传递将屈服于的块。这些方法提供了我正在寻找的那种调用点定制,此外,它们的声明将作用域绑定到控制器,这样它们就可以访问与控制器相同的内容,但这些方法似乎非常有限:它们不包含对正在序列化的对象的引用。它们包含对builder对象的引用,当然,我想您可以在block/proc中进行解析,找到已经序列化的属性并使用它们,但这是一个长篇大论,或者至少是不容易的和次优的

如果我在这里错了,请纠正我,但是如果必须访问对象本身,在序列化一个或多个对象时,让proc/块可用有什么意义呢

不管怎样,请告诉我我是怎么错的,因为我似乎一定忽略了这里的某些东西

哦,是的,我知道我可以写我自己的观点。我正试图利用response\u to和to\u xml来实现最小的额外文件/行。(不过,当我不知道如何使用AR的序列化时,我就求助于此。)


**编辑3.29.09——我刚刚向Rails提交了一个补丁。如果您感兴趣,请显示一些支持:)

实际上,Proc被传递到与您传递到\u xml的相同的选项哈希(减去procs选项)。因此,您可以传入Proc执行其任务所需的任何额外对象:

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

由于您得到的过程与xml的选项相同,因此这允许您传入所需的任何选项。

Woo!我处理这个场景的补丁被接受了:它现在是ActiveModel的一部分,我不确定它的发布时间表是什么;我在想Rails 3

因此,在这里的示例中,“object”是一个额外的k/v对,您正在使用它,它将传递给每个序列化调用和过程。那很好。它当然创造了可能性。挑战仍然存在:如何在阵列上实现这一点?将数组作为额外的k/v传入并串联迭代:/