RoR, HAML et des if

17372
,

Hello,
cela fait bien 1jours que je cherche comment faire ce tout petit bout de code. J'espere que vous allez pouvoir m'aider. :P

Voila la situation, je voudrais avoir comme résultat :

<div class="wrapper">
  <div class="wrap-1">
      <div class="inner-wrap-1"></div>
      <div class="inner-wrap-1"></div>
      <div class="inner-wrap-1"></div>
  </div>
  <div class="wrap-2">
      <div class="inner-wrap-2"></div>
      <div class="inner-wrap-2"></div>
      <div class="inner-wrap-2"></div>
  </div>
  <div class="wrap-3">
      <div class="inner-wrap-3"></div>
      <div class="inner-wrap-3"></div>
      <div class="inner-wrap-3"></div>
  </div>
</div>

un truc simple, classic, mais combiné avec RoR et HAML, je suis un peu perdu.
J'ai deja fait quelque trucs qui me donne tous les inner-wrap-[1,2,3] mais sans les wraps. La raison l'indentation je ne sais pas comment faire pour changer ca.

Si je resume ce que je veux faire :

  • boucler sur les jours de 3 semaines; en -1; +2 par rapport au début de la semaine d'aujourd'hui.
  • de grouper les jours par semaine

voila ce que j'ai produit pour l'instant.

.wrapper
    - today = @date.beginning_of_week
    - (today-1.week..today+2.week).each_with_index do |date, index|

        //c'est la qu'est le probleme
        - .wrap-1.week-1 if index == 0
        - .wrap-2.week-2 if index == 7
        - .wrap-3.week-3 if index == 14

        .inner-wrap.day

Mais je ne sais pas comment introduire mes wraps. J'ai bien tenter de faire des if mais avec HAML il faut indenter correctement pour que cela fontionne et cela pose probleme pour les jours suivants qui sont tous dans le week-3.

Merci.

2 Réponse

Default
,

Il te faut utiliser les helpers Rails pour cela (app/helpers/application_helper.rb par exemple). Tu vas devoir creer une methode dans laquelle tu passe par exemple une date, et qui te generera le code HTML correspondant. J'ai fait une ebauche rapide de ce que tu essai de faire et grosso-merdo, sa donne un truc de ce genre :

def create_wrapper_tag_for(date)
  today = date.beginning_of_week
  week_num = 0
  capture_haml do
    haml_tag '.wrapper' do
      (today - 1.week..today + 2.weeks).each do |d|
        if d == d.beginning_of_week
          week_num += 1
          haml_tag "div.wrap-#{week_num}.week-#{week_num}" do
            (d..d.end_of_week).each do |day|
              haml_tag "div.inner-wrap-#{day.to_date}"
            end
          end
        end
      end
    end
  end
end

Ensuite, tout ce que tu as a faire est d'appeler cette methode depuis ton template :

= create_wrapper_tag_for(Time.zone.today)

Le code ci-dessus par exemple genere ceci :

<div class='wrapper'>
    <div class='wrap-1 week-1'>
        <div class='inner-wrap-2015-11-09'></div>
        <div class='inner-wrap-2015-11-10'></div>
        <div class='inner-wrap-2015-11-11'></div>
        <div class='inner-wrap-2015-11-12'></div>
        <div class='inner-wrap-2015-11-13'></div>
        <div class='inner-wrap-2015-11-14'></div>
        <div class='inner-wrap-2015-11-15'></div>
    </div>
    <div class='wrap-2 week-2'>
        <div class='inner-wrap-2015-11-16'></div>
        <div class='inner-wrap-2015-11-17'></div>
        <div class='inner-wrap-2015-11-18'></div>
        <div class='inner-wrap-2015-11-19'></div>
        <div class='inner-wrap-2015-11-20'></div>
        <div class='inner-wrap-2015-11-21'></div>
        <div class='inner-wrap-2015-11-22'></div>
    </div>
    <div class='wrap-3 week-3'>
        <div class='inner-wrap-2015-11-23'></div>
        <div class='inner-wrap-2015-11-24'></div>
        <div class='inner-wrap-2015-11-25'></div>
        <div class='inner-wrap-2015-11-26'></div>
        <div class='inner-wrap-2015-11-27'></div>
        <div class='inner-wrap-2015-11-28'></div>
        <div class='inner-wrap-2015-11-29'></div>
    </div>
</div>

Rien n'est optimiser ici, je te conseil de refactorer un peu tout cela et de te renseigner sur les helpers Haml http://haml.info/docs/yardoc/Haml/Helpers.html

17372
,

waow, un grand MERCI.
Je vais regarder de plus pres les capture_haml et haml_tag, je ne connaisais pas.

Merci