2010-04-21 7 views
2

J'essaie de rendre un calendrier avec Rails et Haml.Haml - if-else avec des indentations différentes

Les dates utilisées proviennent d'une variable appelée @dates. Il s'agit d'une plage Date qui contient les premier et dernier jours à afficher sur le calendrier. Le premier jour est toujours le dimanche et le dernier jour est toujours le lundi.

Je prévois de rendre un calendrier typique, avec une colonne par jour de la semaine (dimanche sera le premier jour de la semaine) en utilisant un tableau HTML.

Donc, je dois mettre un %tr suivi d'un %td le dimanche, mais le reste du jour j'ai juste besoin d'un %td.

Je n'arrive pas à modéliser cela dans Haml. Cela semble exiger différents niveaux d'indentation, et c'est quelque chose qu'il n'aime pas. Voici ma tentative échouée:

%table 
    %tr 
    %th= t('date.day_names')[0] # Sunday 
    %th= t('date.day_names')[1] 
    %th= t('date.day_names')[2] 
    %th= t('date.day_names')[3] 
    %th= t('date.day_names')[4] 
    %th= t('date.day_names')[5] 
    %th= t('date.day_names')[6] # Monday 
    [email protected] do |date| 
    - if(date.wday == 0) # if date is sunday 
     %tr 
     %td=date.to_s 
    - else 
     %td=date.to_s 

Cela ne fonctionne pas comme je le souhaite. Les %td s pour les jours non dimanche apparaissent en dehors de la %tr:

 <tr> 
     <td>2010-04-24</td> 
     </tr> 
     <td>2010-04-25</td> 
     <td>2010-04-26</td> 
     <td>2010-04-27</td> 
     <td>2010-04-28</td> 
     <td>2010-04-29</td> 
     <td>2010-04-30</td> 
     <tr> 
     <td>2010-05-01</td> 
     </tr> 
     <td>2010-05-02</td> 
     <td>2010-05-03</td> 
     ... 

J'ai essayé d'ajouter deux autres espaces à l'else mais Haml se sont plaints de retrait non conforme.

Quelle est la meilleure façon de faire cela?

Remarque: Je ne suis pas intéressé par le rendu du calendrier en utilisant des listes non ordonnées. Veuillez considérer l'utilisation d'une table comme l'une des contraintes du problème.

Répondre

4

commentaire de Evgeny me mettre sur la bonne voie.

est ici une solution qui fonctionne, en utilisant in_groups_of de rails (lien est mort en ce moment):

%table(cellspacing="0" cellpadding="0") 
    %tr 
    %th= t('date.day_names')[0] 
    %th= t('date.day_names')[1] 
    %th= t('date.day_names')[2] 
    %th= t('date.day_names')[3] 
    %th= t('date.day_names')[4] 
    %th= t('date.day_names')[5] 
    %th= t('date.day_names')[6] 

    - @dates.to_a.in_groups_of(7) do |week| 
    %tr 
     - week.each do |day| 
     %td=day.to_s 

Notez que je devais convertir la chaîne en un tableau - gammes ne semblent pas mettre en œuvre in_groups_of.

1
%table 
    %tr 
    %th= t('date.day_names')[0] # Sunday 
    %th= t('date.day_names')[1] 
    %th= t('date.day_names')[2] 
    %th= t('date.day_names')[3] 
    %th= t('date.day_names')[4] 
    %th= t('date.day_names')[5] 
    %th= t('date.day_names')[6] # Monday 
    %tr 
    [email protected] do |date| 
     %td=date.to_s 

Cela devrait vous donner

<tr> 
    <td>2010-04-24</td> 
    <td>2010-04-25</td> 
    <td>2010-04-26</td> 
    <td>2010-04-27</td> 
    <td>2010-04-28</td> 
    <td>2010-04-29</td> 
    <td>2010-04-30</td> 
</tr> 
+0

Je crois que cela ne fonctionnera qu'avec la première rangée de jours (première semaine). @dates contient plusieurs semaines, pas une seule. Je veux mettre un% tr par semaine. – kikito

+1

Vous ne pouvez pas le faire en haml d'une manière normale. Il y a deux options. Tout d'abord, découpez votre tableau en plusieurs semaines et répétez chacun d'entre eux comme indiqué dans ma réponse (ce serait ma solution préférée). Deuxièmement, en fait imprimer les balises manuellement: = "" lorsque vous en avez besoin (c'est une solution laide). Si vous avez besoin d'un exemple de la première approche, je peux l'esquisser. –

+1

J'ai trouvé un moyen de le faire en utilisant in_groups_of (ajout de réponse). Merci pour l'aide, j'ai été vraiment bloqué par ce genre d'indentation. – kikito

Questions connexes