创建新类以放入Ruby中的Array

时间:2014-04-02 10:57:51

标签: ruby-on-rails ruby arrays

我来自C#背景并尝试学习Ruby和Ruby on Rails。我有以下Car类 - 请注意我需要的build_xml方法,以便在该语法中构建XML,然后传递给WebService

class Car

  @@array = Array.new
  #this will allow us to get list of all instances of cars created if needed
  def self.all_instances
    @@array
  end

  def initialize(id, model_number, engine_size, no_doors)
    # Instance variables
    @id = id
    @model_number = model_number
    @engine_size = engine_size
    @no_doors = no_doors
    @@array << self
  end

  def build_car_xml
    car = { 'abc:Id'=> @id, 'abc:ModelNo' => @model_number, 'abc:ES' => @engine_size, 'abc:ND' => @no_doors}
   cars = {'abc:Car' => [car] }   
  end

end

在另一个课程中,我使用如下:

car1 = Car.new('1', 18, 3.0, 4)
request = car1.build_car_xml

这按预期工作,请求格式化我需要的方式,webservice返回结果。我现在想要扩展它,所以我可以传递一系列汽车并生成请求XML - 但是我很难让这部分工作。

到目前为止,我一直在尝试以下内容(目前我只是更改ID,因为它是唯一需要唯一的参数):

  car_array = []
  (1..10).each do |i|
    car_array << Car.new(i.to_s, 18, 3.0, 4)
  end

我是否正确地说我需要在我的Car类上定义一个新的build_car_xml方法,该方法可以获取一系列汽车,然后构建xml,以便我的请求调用类似于:

request = Car.build_car_xml(car_array)

我不确定的是1) - 这是在Ruby中做事的正确方法吗?2)如何构建方法,以便以我调用它时的方式构建XML格式正确在单个对象上 - 即 - 我需要在实际值之前添加名称空间。

def build_car_xml(car_array)
 #here is where I am unsure how to contruct this method   
end

1 个答案:

答案 0 :(得分:1)

可能的解决方案('abc:Car'是一个错误的名称,如果你想让它保存一个数组,应该是Cars):

class Car

...

  def self.build_cars_xml(cars)
    { 'abc:Car' => cars.map(&:build_car_xml) }   
  end

  def build_car_xml
    { 'abc:Id'=> @id, 'abc:ModelNo' => @model_number, 'abc:ES' => @engine_size, 'abc:ND' => @no_doors }
  end
end

cars =
  (1..10).map do |i|
    Car.new(i.to_s, 18, 3.0, 4)
  end
Car.build_cars_xml(cars)

它并不符合您的要求,因为实例build_car_xml没有生成Car命名空间,但对我而言,它有些不一致。您的XML实际上是一个集合,即使它只有一个元素,实例方法也不应该负责集合。 Car.build_cars_xml([Car.new(...)]对我来说更符合逻辑。