2011-11-02 104 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学习。 –