2009-04-16 7 views
2

Dans chaque application web que je compile, je rencontre ce problème. Je veux mettre des classes sur des éléments HTML conditionnellement. Par exemple, parfois le <div> pour un poste ressemble:Méthode recommandée: définition de classes HTML dans une application Web

<div class="post">...</div> 

Et parfois, il ressemble à ceci:

<div class="post even recent replied_to author_is_admin">...</div> 

Chaque classe après post est là parce que une certaine logique a décidé qu'il devrait être. Quel est le meilleur moyen de cela? Dans Rails + HAML, je suis coupable de faire des choses comme:

-classes = [] 
-classes << cycle('even', 'odd') 
-classes << 'recent' if post.recent? 
-classes << 'replied_to' if post.replied_to? 
-classes << 'author_is_admin' if post.author_is_admin? 
.post{:class => classes.join(' ')} 
    ... 

Ce n'est pas assez, et je l'ai raccourci à utiliser une aide que je peux faire:

.post{:class => "#{cycle('even', 'odd')} #{post_classes}"} 

Il semble toujours que cela devrait être plus facile à lire, parce que c'est quelque chose que nous faisons tout le temps. Avez-vous des méthodes pour rendre ce processus court et lisible?

Répondre

1

Je pense que ce que vous avez fait est bien. Je suggérerais seulement quelques améliorations mineures. L'une serait de mettre l'appel de cycle dans post_classes. Pour plus de lisibilité, je ferais en sorte que post_classes accepte l'argument Post. Cela crée un peu de redondance, mais vous pouvez facilement l'éviter en définissant cette méthode d'assistance:

def classes(object) 
    case object 
    when Post then post_classes(object) 
    end 
end 

De cette façon, votre code de modèle ressemblera à ceci:

.post{:class => classes(Post)} 
Questions connexes