2013-01-10 4 views
0

Je reçois cette sortie. le nombre affiché en sortie est post.user.id.
La bulle devrait être commutée d'avant en arrière s'il s'agissait d'un identifiant différent.
Mais il juge que c'est la même personne même si ce n'est pas le cas.
Pourquoi?Pourquoi ma vue avec if ne fonctionnera pas correctement?

Courant de sortie

2   Good, you?   > Person B 
1   How have you been? > person A 
2   What's up?   > person B 
Person A < Hello!!!!    1 

Je n'étais pas cette sortie

2   Good, you?   > Person B 
Person A < How have you been?  1 
2   What's up?   > person B 
Person A < Hello!!!!    1 

Voir

<% who = "" %> 
<% @posts.each do |post| %> 

    <tr id="<%= dom_post_id(post) %>"> 

     <% if post.user.id == who %> 
      <td><%= post.user.nickname if post.user %></td> 
      <td><div class="bubble me"><%= post.body %></div></td> 
      <td><%= post.user.id %></td> 
     <% else %> 
      <td><%= post.user.id %></td> 
      <td><div class="bubble you"><%= post.body %></div></td> 
      <td><%= post.user.nickname if post.user %></td>  
     <% end %> 
    </tr> 
    <% who = post.user.id %> 
<% end %> 
+0

Je pense que c'est peut-être parce que vous définissez 'who = post.user.id' à la fin de la boucle. Cela définit 'who' au propriétaire du message en cours, mais le message suivant est l'autre utilisateur. Donc, l'instruction if échoue et passe dans le bloc else. – jonhopkins

+0

Je suis d'accord mais je ne comprends pas pourquoi la dernière sortie affiche la personne A dans la première colonne – Wasi

+0

Oui, je suis perdu sur cela aussi ... – jonhopkins

Répondre

2

Vous devrait factoriser votre code comme ceci:

<% user_id_for_left_side = @posts.first.try(:user_id) %> 
<% @posts.each do |post| %> 

    <tr id="<%= dom_post_id(post) %>">  
    <% if post.user_id == user_id_for_left_side %> 
     <td><%= post.user.nickname %></td> 
     <td><div class="bubble me"><%= post.body %></div></td> 
     <td><%= post.user_id %></td> 
    <% else %> 
     <td><%= post.user_id %></td> 
     <td><div class="bubble you"><%= post.body %></div></td> 
     <td><%= post.user.nickname %></td>  
    <% end %> 
    </tr> 

<% end %> 

Pourquoi utiliser post.user_id au lieu de post.user.id? Car faire post.user_id utilise moins de ressources que post.user.id.

Pourquoi supprimer if post.user? Il est implicite que chaque publication appartient à un utilisateur (vous devez avoir une validation de présence sur le modèle Post pour l'attribut user_id). Cela signifie qu'un poste a toujours un utilisateur associé, pas besoin de vérifier sa présence.

+0

Cela entraînera toujours l'affichage de tous les messages avec le surnom sur la droite. – jonhopkins

+0

Le résultat est toujours le même – Foo

+0

ajouter un '<% = last_user_id%>' pour déboguer et voir si elle a le comportement attendu – MrYoshiji

1
<% who = -1 %> 
<% @posts.each do |post| %> 

    <% if who == -1 %> 
     <% who = post.user.id %> 
    <% end %> 

    <tr id="<%= dom_post_id(post) %>"> 

     <% if post.user.id == who %> 
      <td><%= post.user.nickname if post.user %></td> 
      <td><div class="bubble me"><%= post.body %></div></td> 
      <td><%= post.user.id %></td> 
     <% else %> 
      <td><%= post.user.id %></td> 
      <td><div class="bubble you"><%= post.body %></div></td> 
      <td><%= post.user.nickname if post.user %></td>  
     <% end %> 
    </tr> 

<% end %> 

Le bloc ajouté if fixera le who variable à l'identifiant de l'utilisateur du premier message de la rencontre de la boucle, et ensuite ne pas fixer à nouveau. À chaque itération de la boucle après cela, post.user.id sera who chaque fois que le message aura cet identifiant, et le surnom sera sur la gauche. Pour les messages avec un identifiant différent, le pseudo sera sur la droite.

+1

Mauvaise idée de comparer qui avec -1 à chaque boucle. Il est inutile – MrYoshiji

+0

@MrYoshiji C'est utile la première itération. Et je n'ai jamais utilisé Ruby auparavant, donc je ne sais rien de ses collections, ou comment obtenir une propriété sur le premier élément dans '@ posts'. Si vous pouvez proposer une meilleure solution avec le même effet, je serai heureux de vous donner un crédit là où il est dû. – jonhopkins

+0

Je suis d'accord avec MrYoshiji. vous pouvez utiliser @ posts.first pour obtenir le premier. –

Questions connexes