2011-11-02 148 views
0

我想在Sinatra中使用一個範圍來迭代。Sinatra:幫手和紅寶石範圍

,當我嘗試像

helpers do 
    def iteration 
    (1..6).each do |x| 
     x 
    end 
    end 
end 

,並呼籲從我的應用程序的幫手,它打印1..6

,如果我改變

(1..6).to_a do #... 

其打印123456

是否正常?還是我需要在我的應用程序中需要更多的東西才能夠使用範圍?

回答

2

你還是會需要調用each

(1..6).to_a.each do ... 

在您的輔助方法,你實際上並不什麼。方法iteration將返回方法中最後一條語句的結果; each返回傳遞給它的參數,這就是顯示的內容。

+0

我知道它什麼都不做,我只是在測試這個東西。我嘗試過to_a,因爲Sinatra似乎並不瞭解每一個範圍,我想檢查這是否屬實。令我驚訝的是它沒有對每個數組的調用迭代數組。 –

2
helpers do 
    def iteration 
    (1..6).each do |x| 
     x 
     #it dosen't mean output the 123456, this just let the method return a value 1..6 
     #in other words, it still iteras the array in backgroud, 
     #but not outputs in terminal, you can't see it. 

     print x 
     #it prints 123456, really 
    end 
    end 
end 

編輯

在西納特拉,你可以做,如下面的

get '/t' do 
    #it will output the 123456 
    body = "" 
    (1..6).each do |x| 
     body << x.to_s 
    end 
    body 
end 
+0

我試圖找到一種方法來從Sinatra助手輸出html代碼(可以使用markaby,但我必須等待IT dpt決定他們是否安裝它)。所以我想循環遍歷一個範圍來輸出標記。但不能讓這件事在Sinatra工作。雖然在irb罰款。 –

+0

或者,使用Sinatra中的模板作爲你的答案。 – coolesting

0

我試圖找到一種方式來輸出HTML代碼與西納特拉一個幫手(可以使用引入markaby但我必須等待IT部門決定是否安裝它)。所以我想循環遍歷一個範圍來輸出標記。但無法讓這件事在Sinatra中奏效。雖然在irb罰款。

這到底是我做過什麼

def tag_iterator 
    (1..6).map do |x| 
    "<p>#{x}</p>" 
    end 
end 

在模板:

__END__ 

@@index 
%h1= @title 
.test 
    %div= "#{tag_iterator}" 

而現在通過正常範圍內循環。我猜Ruby對我來說太神奇了,我可以花幾個小時來猜測事情的工作方式:^ P

+0

'each'純粹是爲了副作用而執行的(例如,用'puts'打印到屏幕上),並且您的原始文章中沒有任何內容。另一方面,'map'用於收集塊返回的值(因此爲其收集'collect'別名),所以你最終得到你想要的結果。沒有涉及任何種類的魔法。順便說一句:你最初的例子打印了'1..6',因爲'each'返回它被調用的對象。 –

+0

感謝您的澄清:) –

+0

不客氣! :-)在線有一些優秀的Ruby資源,比如RubyLearning,Code School等,也許你想用其中的一個來開始你的Ruby學習。 –