2010-07-16 4 views
0

Je suis encore nouveau sur les rails et rubis développement web si s'il vous plaît garder avec moi:comment cycle avec des tableaux entiers Ruby on Rails

J'ai deux tableaux a1 = [1,2,3,4] b1 = [7,6,5,4]

Je veux alterner quel tableau j'utilise; commutation entre a1 [] et b1 [].

J'essaye actuellement d'utiliser la commande cycle() pour accomplir ceci.

<% @good_bad = [7,6,5,4,3,2,1] %> 
<% @bad_good = [1,2,3,4,5,6,7] %> 
WITHOUT CYCLE:</br> 
    <% @super = @bad_good%> 
    <%= @super%> 
    <%= @super[0]%> 
    <%= @super[1]%> 
    <%= @super[2]%> 
WITH CYCLE: </br> 
    <% @temp_array = cycle(@bad_good , @good_bad , :name => "rating")%> 
    <%= @temp_array%> 
    <%= @temp_array[0]%> 
    <%= @temp_array[1]%> 
    <%= @temp_array[2]%> 

Cet écran volonté:

ITHOUT CYCLE: 1234567 1 2 3 AVEC CYCLE: 1234567 49 50 51

Je me attends à imprimer être le même depuis le premier cycle, il stocke le @temp à @bad_good.

Il y a probablement quelque chose de fondamental qui me manque. C'est bizarre quand quand j'essaie d'obtenir les valeurs uniques du tableau, j'imprime 49,50,51, mais quand j'imprime tout le tableau c'est précis?

Tout conseil apprécié, Merci, D

+0

@Karl réponse explique le comportement que vous obtenez. Mais pouvez-vous expliquer ce que vous essayez de réaliser? Votre exemple de code a l'air terrible et j'espère que vous ne l'utiliserez pas (ou quelque chose de très similaire) n'importe où. Et 'cycle' est un assistant de texte. À mon avis, vous ne devriez pas l'utiliser comme vous le souhaitez. – klew

Répondre

2

Je dois admettre que je ne suis même pas sûr de savoir comment votre code fonctionne maintenant, parce que cycle est une méthode Enumerable et vous ne semble pas être l'appeler sur tout objet énumérable.

En tout cas, pour créer un recenseur qui parcourra entre deux tableaux pour toujours, vous feriez comme ceci:

(array1 + array2).cycle 

Ainsi, par exemple:

array1 = 1.upto(7).to_a 
array2 = 7.downto(1).to_a 
sequence = (array1 + array2).cycle 
sequence.take 49 
# => [1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7] 

Edit: explication de Karl fourni la pièce manquante. Je pensais à Enumerable#cycle, mais c'est TextHelpers#cycle. Je pense que la méthode Enumerable est en réalité plus proche de ce que vous cherchiez, cependant.

+0

Honnêtement, je ne savais même pas que le cycle Enumerable # existait. Je vais en lire plus à ce sujet. Merci pour le conseil tu. Fondamentalement, j'ai 10 rangées de boutons radio. La première rangée doit représenter les valeurs de 1 à 7. La deuxième rangée représente les valeurs de 7 à 1. Et ceci alterne pour chaque rangée. Je suppose que le moyen le plus simple était de modifier l'index pour voir s'il s'agit d'une ligne paire ou impaire, puis de choisir de quel tableau extraire la valeur. Je ne savais pas comment les conditions fonctionnaient avec ruby ​​sur rails ou peut-être je suis juste un googler terrible = ( Merci THOU! – darewreck

3

Je crois que le fonctionnement de cycle(), il convertira la sortie en une chaîne. Donc, lorsque vous appelez @tempt_array[0], elle retourne quelque chose comme "1234567"[0]

Mes tests dans la console est revenu ce que je pensais:

"1234567".to_s[0] 
=> 49 
"1234567".to_s[1] 
=> 50 
"1234567".to_s[2] 
=> 51 

Je crois que ce sont les codes de caractères ASCII pour « 1 », « 2 », et "3" comme vu ici: http://www.asciitable.com/

Vous aurez probablement besoin d'écrire votre propre méthode d'énumération, ou en trouver une autre à utiliser.

+0

Cela a du sens .... Je me demandais d'où ces chiffres venaient Merci !! – darewreck

1

Vous pouvez également découper le cycle complètement et il suffit d'utiliser

@temp_array = @good_array.zip(@bad_array).flatten 

[1,2,3].zip([3,4,5]).flatten # => [1, 3, 2, 4, 3, 5] 
+0

Oh, c'est peut-être ce qu'il a en tête, je pensais qu'il voulait ajouter les tableaux de bout en bout, mais intercaler de cette façon peut-être raison – Chuck

+0

Je voulais éviter de construire un très long tableau de valeurs. temps que j'ajoute une rangée supplémentaire de boutons radio, ça va me faire ajouter plus de tableaux ensemble Merci !! – darewreck

0

Voici ce que je pense que vous essayez de faire, mais je ne suis pas certain à 100%:

a1 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] 
a2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] 

a1.zip(a2).each_with_index{|array, index| array.reverse! if index % 2 == 0}.map{|a| a.first} 
# => ["a", "B", "c", "D", "e", "F", "g", "H", "i", "J"] 

# Alternatively: 
a1.zip(a2).each_with_index{|array, index| array.reverse! unless index % 2 == 0}.map{|a| a.first} 
# => ["A", "b", "C", "d", "E", "f", "G", "h", "I", "j"] 

I Je suis sûr qu'il y a un moyen plus court de le faire, mais je ne peux pas y penser maintenant.Editer: Pour répondre à vos questions dans le commentaire - les deux <%%> et <% =%> exécuteront le code ruby ​​qu'ils contiennent, mais le second affichera la réponse au HTML, tandis que le premier l'emportera ' t. Par conséquent, les instructions conditionnelles sont généralement placées dans le premier. Ainsi, par exemple, vous pourriez faire:

<% if @user.admin? %> 
    <%= edit_link %> 
<% else %> 
    You're not an admin! 
<% end %> 
+0

En fait, vous m'avez donné la solution la plus simple que j'ai besoin d'essayer. travaillé en ruby ​​sur des rails pour les pages de vue.Je suis un programmeur C++ et rea lly nouveau au développement web. Je pourrais juste voir si l'index% 2 == 0 pour déterminer si son vieux ou même, et choisir quel tableau pour saisir la valeur de basée sur cela. Je voulais juste clarifier, <% %> représentent le code de rubis. Donc, n'importe quoi dans ces parenthèses peut être du code ruby? Désolé encore si c'est une question stupide. MERCI !! – darewreck