2012-10-03 1 views
0

Voici la chose. J'ai un bouton qui, selon le scénario, va se comporter, regarder et avoir un texte différent. Voici comment, à peu près, ressemble au moment:Comment mettriez-vous en œuvre le principe «tell do not ask» dans HAML?

- if params[:param_A] && @statement_A 
    %span.button.cancel_button{attribute: "value_B"} 
    - if @statement_B 
     = t('locale_A') 
    - else 
     = t('locale_B') 
- elsif params[:param_A] 
    %span.button.cancel_button{attribute: "value_A"} 
    - if @statement_B 
     = t('locale_A') 
    - else 
     = t('locale_B') 

Il y a aussi une classe CSS sur les deux boutons doivent avoir si statement_B est vrai.

Donc, c'est un gâchis. Et j'ai récemment lu sur le principe "Dites, ne demandez pas" que j'ai beaucoup aimé, donc j'aimerais bien l'appliquer ici ... mais je ne sais pas comment.

Je sais que je pourrais faire une aide, mais je voudrais rester loin d'eux pour des raisons (j'ai vraiment quelques raisons valables de le faire, mais ceux-ci sont au-delà de la portée de cette question). Je peux recourir à cela comme dernière ressource, mais je préférerais trouver une autre solution.

+0

La question est, pourquoi mettez-vous votre logique conditionnelle dans le modèle HAML, au lieu de dans votre contrôleur? Vous en savez plus sur la situation à l'intérieur du contrôleur que dans la vue, calculez donc vos valeurs avant de passer le contrôle. Dans la vue, vous venez de rendre la sortie, avec très peu besoin d'utiliser des tests conditionnels. –

+0

Je suis d'accord avec @theTinMan, ce genre de logique conditionnelle ne devrait pas être à votre avis. Soit travailler dans le contrôleur ou au moins le mettre dans une aide. – link664

Répondre

1

Ceci n'est pas vraiment lié à haml. Vous pouvez commencer par la manière dont votre exemple devrait regarder avec tekll-don'r demander:

- if params[:param_A] 
    %span.button.cancel_button{attribute: @object1.value} 
    = t(@object2.locale) 

ou

- if params[:param_A] 
    %span.button.cancel_button{attribute: @object.value} 
    = t(@object.locale) 

(selon votre déclaration préférence/ce qui est vraiment A/B moyenne)

Pour que cela fonctionne, vous devez initialiser les objets avant le rendu, en fonction de la valeur de l'instruction.

+0

+1 pour «Pour que cela fonctionne, vous devez initialiser les objets avant le rendu, en fonction de la valeur de l'instruction. Les objets doivent être compris dans le contrôleur, avant d'être transmis à la vue. –

Questions connexes