我来自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
答案 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(...)]
对我来说更符合逻辑。