RoR, HAML et des if

Par Amstramgram, il y a 10 ans


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 :

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éponses

kal-el, il y a 10 ans

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

Amstramgram, il y a 10 ans

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

Merci