2011-10-14 56 views
1

我把一些項目Rails和我想複製這個PHP代碼:如何在Ruby中複製此PHP代碼?

http://www.php.net/manual/en/functions.anonymous.php#106046

到目前爲止,我有這樣的:

def html (tag, id = "", hclass = "") 
    hopen = "<#{tag}" 
    hclose = "</#{tag}>" 
    unless id == "" 
    hopen += " id=\"#{id}\"" 
    end 

    unless hclass == "" 
    hopen += " class=\"#{hclass}\"" 
    end 

    hopen += ">" 

    return lambda { |data| print hopen,data,hclose} 
end 

我需要創建可變變量,如這在: PHP

$layout = array('container','header','pmain','lsidebar','rsidebar','footer'); 

foreach ($layout as $element) 
    $$element = html ("div", $element); 

這裏是我的RUBY原型

layout = [:body, :header, :sidebar, :footer] 

##I know this isn't right, but how do I create the dynamic functions like PHP??? 
layout.each {|x| instance_variable_set "@#{x}", 0 } 

另外,我需要調用的功能,反正有做到這一點,而不調用方法?如果我必須嵌套呼叫,它會變得混亂。

h1 = html(:h1) 
mainx = html(:div) 
puts mainx.class 
puts mainx.call(h1.call("Blog!")) 

回答

2

如果你是一個Rails項目,有很多助手,幫助你建立HTML

事實上,有一個叫** content_tag一個輔助方法**做同樣的事情。你可以看到這裏的文檔:http://apidock.com/rails/v3.1.0/ActionView/Helpers/TagHelper/content_tag

使用範例

content_tag(:tag_i_want, :id => 'my_id', :class => 'my_class') do 
    "the content I want inside the tag" 
end 

輸出:

<tag_i_want id="my_id" class="my_class">the content I want inside the tag</tag_i_want> 

的第二個問題有點奇怪。更多地解釋你想做什麼。 ¿創建@body,@header,@sidebar和@footer變量?¿全部?

+0

謝謝,我想我試圖重新發明輪子。儘管如此,我想要一個非常緊湊的表示法。仍然好奇如何在Ruby中做這些事:)。 – Len

+0

@Len:['content_tag'](http://api.rubyonrails。org/classes/ActionView/Helpers/TagHelper.html#method-i-content_tag)需要很多選擇,但是你不需要全部提供。它可以像這樣緊湊:'content_tag:h1,「Blog!」'。然而,你的代碼非常接近,很顯然你正在理解的道路上。這是一篇可能有所幫助的(老式的)文章:http://www.igvita.com/2007/03/15/block-helpers-and-dry-views-in-rails/ –

+0

是的,我想用一個數組來創建那些是函數指針的變量。另外,我想使用這些文字作爲函數的參數。我要從我在這裏學習的東西做更多的研究......謝謝! – Len

4

你在這裏做了很多,但這裏的一些幫助與過渡:

$layout = array('container','header','pmain','lsidebar','rsidebar','footer'); 

foreach ($layout as $element) 
    $$element = html ("div", $element); 

這是一個數組改造,據我所知道的,所以相當於是這樣的:

layout = [ @container, @header, @pmain, @lsidebar, @rsidebar, @footer] 

layout.collect! do |element| 
    # Using the built-in content_tag method instead of 
    # the custom reimplementation with curried parameters. 
    content_tag("div", element) 
end 

沒有Ruby方法來取消引用變量,因爲Ruby中的變量的行爲方式完全不同。實例變量保持在對象的上下文中,而變量只保留在給定的範圍內。您可以通過名稱獲取和設置任意實例變量,但通常不能對局部變量進行相同操作。除了eval { var }之外,在Ruby中沒有$$var等價物,由於評估潛在的任意代碼的方式,這實際上令人不悅。

雖然我確實有一種不好的感覺,爲什麼你需要這樣做。模板應該是一種繞過這種低級別的事情的方式。

如果您是Ruby的新手,那麼通過閱讀有關String和Array的文檔可以發現它們都充滿了有用的方法。 Array還包含Enumerable模塊,它增加了更多。

+0

+1,很好回答 – apneadiving

+0

我是Ruby的新手。你的答案真的解釋了很多!我知道eval,但我避免了像PHP的瘟疫。拋開HTML問題,是否可以採用一系列符號或其他方法,並使用該數組創建命名的「函數指針」,並將該元素用作函數中的參數。從我看到的情況來看,這可能是不可能的。 – Len

+0

Ruby和JavaScript一樣,通常沒有函數指針,而是引用函數,這是一種不同的東西。 Ruby中的最佳做法是創建一個Proc,它可以在調用時執行所需的操作,或者保留要調用的方法的符號。例如:'container_html = lambda {...}'或'container_method =:container'後面跟着'container_html = some_object.send(container_method)'' – tadman