在Rails中为to_xml序列化程序设置新的默认属性

时间:2008-12-22 20:14:27

标签: ruby-on-rails xml-serialization

在Rails中,我正在编写一系列控制器来生成XML。每次我将多个属性传递给to_xml,如:

to_xml(:skip_types => true, :dasherize => false)

有没有办法可以将这些设置为新的默认属性,只要在我的应用程序中调用to_xml就可以应用这些属性,这样我就不必重复自己了?

3 个答案:

答案 0 :(得分:3)

您是在散列或ActiveRecord模型(或其他)上调用to_xml吗?

我不是你想要的,但你可以轻松地修补to_xml并重新定义它以从这些参数开始。我建议你创建一个新方法to_default_xml,只需用你想要的参数调用to_xml

def to_default_xml
  self.to_xml(:skip_types => true, :dasherize => false)
end

更新

由于你想将它添加到几个ActiveRecord模型中,你可以做两件事,打开ActiveRecord :: base(有点hackish和脆弱)或创建一个模块并将其导入你想要使用的每个模型用它。打字更多,但代码更清晰。

我会在lib /中放一个看起来像这样的类:

module DefaultXml
  def to_default_xml
    self.to_xml(:skip_types => true, :dasherize => false)
  end
end

然后在你的模特中:

class MyModel < ActiveRecord::Base
  include DefaultXml
end

答案 1 :(得分:1)

我整理了一个插件来处理默认的序列化选项。请访问github.com/laserlemon/dry_serial/tree/master查看。

class MyModel < ActiveRecord::Base
  dry_serial :skip_types => true, :dasherize => false
end

它还支持多种序列化样式,可以调用如下:

@my_model.to_xml(:skinny)
@my_model.to_xml(:fat)

答案 2 :(得分:0)

假设您正在讨论AR的to_xml方法,并且根据您的需要,您可以通过创建名为lib \ class_extensions.rb

的文件来扩展AcitveRecord类。
class ActiveRecord::Base   
   def to_xml_default
      self.to_xml(:skip_types => true, :dasherize => false)
   end
end

接下来,将它放在初始化程序中,以便在Rails启动时包含它:

require 'class_extensions'

现在,您可以按如下方式使用它(无需在每个模型中明确包含它):

MyModel.to_xml_default