2008-11-04 44 views
3

我很好奇人们使用AR的to_xml()构建非实体字段的经验(如在,而不是您正在序列化的模型的属性,但也许,利用来自控制器的属性)。使用ActiveRecord构建动态字段:: Serialization.to_xml

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

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

在每个对象中重写to_xml也是一样。

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

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

无论如何,请告诉我我是错的,因为它好像我必须在这里忽略一些东西。

哦,是的,我知道我可以写我自己的看法。我试图利用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

回答

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

因此,在你的例子中,“object”是一个额外的k/v对,你正在使用它将传递给每个序列化调用和proc。那很好。它当然创造可能性。挑战依然存在:你如何在数组上做到这一点?作为一个额外的k/v传入数组,并串联迭代? :/ – jmaxyz 2008-11-04 19:50:29