2011-11-02 4 views
0

J'essayais d'utiliser une gamme pour itérer à Sinatra.Sinatra: gamme helper et ruby ​​

lorsque je tente quelque chose comme

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

et appeler l'aide de mon application, il 1..6 imprimer

si je change de

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

il imprimer 123456

est-ce normal? ou dois-je exiger quelque chose de plus dans mon application pour pouvoir utiliser la gamme?

Répondre

2

Vous auriez encore besoin d'appeler each:

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

Dans votre méthode d'assistance vous ne fait faire quoi que ce soit. La méthode iteration retournera simplement le résultat de la dernière instruction de la méthode; each renvoie l'argument qui lui est passé, c'est ce qui s'affiche.

+0

Je sais que ça ne fait rien, je ne faisais que tester la chose. J'ai essayé avec to_a car Sinatra ne semble pas comprendre chacun sur une gamme, et j'ai voulu vérifier si c'est vrai. À ma grande surprise, il parcourt le tableau sans l'appel de chacun. –

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 

Modifier

Sinatra, vous pouvez le faire comme suit

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

J'essayais de trouver un moyen de sortir le code html d'un assistant avec Sinatra (je pourrais utiliser markaby mais je dois attendre IT dpt pour décider s'ils l'installent ou non). donc je voulais faire défiler une gamme pour sortir le balisage. mais ne pouvait pas faire fonctionner la chose en sinatra. bien dans irb cependant. –

+0

Ou, en utilisant le modèle dans Sinatra comme votre poste de réponse. – coolesting

0

je tentais de trouver un moyen de sortie code html d'une aide avec Sinatra (pourrait utiliser Markaby mais je dois attendre IT dpt pour décider s'ils l'installent ou non). donc je voulais faire défiler une gamme pour sortir le balisage. mais ne pouvait pas faire fonctionner la chose en sinatra. bien dans irb cependant.

En fin de compte ce que je l'ai fait

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

Dans le modèle:

__END__ 

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

Et maintenant itérer à travers la gamme normalement. Je suppose que Ruby est un peu trop magique pour moi, je peux passer des heures à deviner comment ça marche:^P

+0

'each' est exécuté uniquement pour son effet de bord (par exemple, l'impression à l'écran avec' puts') et vous n'en avez eu aucun dans votre message d'origine. D'un autre côté, 'map' est utilisé pour collecter les valeurs renvoyées par le bloc (d'où l'alias' collect') et vous obtenez ainsi ce que vous vouliez. Aucune magie d'aucune sorte impliquée. BTW: votre exemple original a imprimé '1..6' parce que' each' renvoie l'objet sur lequel il a été appelé. –

+0

merci pour la clarification :) –

+0

Vous êtes les bienvenus! :-) Il existe d'excellentes ressources Ruby en ligne, comme RubyLearning, Code School, etc., peut-être que vous voulez utiliser l'un d'entre eux pour démarrer votre apprentissage Ruby. –