2009-12-02 38 views
0

我在Rails应用程序中编写了下面的代码来生成XML。我正在使用Aptana IDE进行Rails开发,并且IDE显示了一个警告,即代码结构在两个块中都是相同的。可以对代码进行哪些更改以消除结构中的重复性?有没有其他的方式来写相同的?Rails XML Builder - 代码重构

xml.roles do 
    @rolesList.each do |r| 
     xml.role(:id => r["role_id"], :name => r["role_name"]) 
    end 
end 

xml.levels do 
    @levelsList.each do |lvl| 
     xml.level(:id => lvl["level_id"], :name => lvl["level_name"]) 
    end 
end 

回答

1

我不得不使用send方法并获得看起来像<send:id>12</send:id>标签同样的问题。为了解决,我使用了“标签!”方法。因此,我认为你的代码看起来像:

def build_xml(node_name, node_list) 
    xml.tag!(node_name.pluralize) do 
    node_list.each do |node| 
     id_str = node["#{node_name}_id"] 
     name_str = node["#{node_name}_name"] 
     xml.tag!(node_name, :id => id_str, :name => name_str) 
    end 
    end 
end 
0

是这样的吗?

def build_xml(node_name, node_list) 
    xml.send(node_name.pluralize) do 
    node_list.each do |node| 
     id_str = node["#{node_name}_id"] 
     name_str = node["#{node_name}_name"] 
     xml.send(node_name, :id => id_str, :name => name_str) 
    end 
    end 
end 

build_xml("role", @roleslist) 
build_xml("level", @levelslist) 

我想使用的send代替eval [我没有尽到很好:编辑改正它--thanks凯西凡石]。

编辑26/12因为XML生成器将捕捉到的发送和使用它作为一个XML分支有两个可能的选项,使用发送方法来代替,这样

 xml.__send__(node_name, :id => id_str, :name => name_str) 

,但我不确定它是否会创建<__send__:roles>。你总是可以回落到

 eval("xml.#{node_name} :id => '#{id_str}', :name => '#{name_str}'") 

这绝对应该工作(但eval应始终使用最后一招)。

+0

发送不带一个字符串 - 它需要一个符号和参数(可选)列表(和很多保护比,因为它EVAL) – 2009-12-03 15:27:36

+0

谢谢你:编辑代码来反映这(在我的红宝石,它也适用于一个字符串,它被转换为一个字符串飞(少输入:)) – nathanvda 2009-12-03 19:34:13

+0

对不起,回来这么晚..这对我不起作用.. “”是我得到的输出。任何输入? – 2009-12-21 16:28:40

1

我也有类似的想法@nathandva,但使用正确发送:因为它增加了视觉的复杂性

def list_to_xml(node_name, list) 
    xml.send(node_name.pluralize.to_sym) do 
    list.each do |item| 
     xml.send(node_name.to_sym, :id => r["#{node_name}_id"], 
       :name => r["#{node_name}_name"]) 
    end 
    end 
end 

,这一变化可能不是最好的。最大的问题是:如果您有可能对xml.roles结构进行更改,您是否也可能更改xml.levels?如果是这样,绝对删除重复。命名该方法对你来说是有意义的,这一点也很重要。补充说,复杂性将会降低而不会增加。

+0

是的,这看起来很不错,至少它是正确的:)我相信在ruby中可用的类似send和eval的东西使它非常强大。我不知道如何用同样紧凑的方式在另一种语言中重构上述问题。 – nathanvda 2009-12-03 19:29:07

+0

@nathanvda我可以在Python中很容易地做到这一点,并可能在Smalltalk中完成。在Java中它不值得付出努力(但是xml模块也不可能)。 – 2009-12-04 14:35:05

+0

对不起找回这么晚了。这不适合我的工作。“”是,我得到..任何输入输出? – 2009-12-21 16:28:09