2009-12-02 85 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