0

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

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

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

4

3 回答 3

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 (有点老套和脆弱)或创建一个模块并将其导入您要使用的每个模型中。多一点打字,但更干净的代码。

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

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

然后在你的模型中:

class MyModel < ActiveRecord::Base
  include DefaultXml
end
于 2008-12-22T20:45:49.120 回答
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)
于 2009-08-28T23:26:05.063 回答
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
于 2009-08-11T17:39:24.367 回答