Pergunta

Em cada compilação webapp I, me deparo com esta questão. Quero aulas definido em elementos HTML condicionalmente. Por exemplo, às vezes o <div> para um cargo parece com:

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

E, às vezes, parece que isso:

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

Cada classe após post está lá porque alguma lógica decidiu que deveria ser. Qual é a melhor maneira de isso? No Rails + HAML, eu fui culpado de fazer coisas como:

-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(' ')}
    ...

Não é bonito, e eu encurtado-lo para usar um ajudante para que eu possa fazer isso:

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

Ainda parece que deve ser mais fácil de ler, porque é algo que fazemos o tempo todo. Será que você tem quaisquer métodos pelos quais você tornam este processo curto e legível?

Foi útil?

Solução

Eu acho que o que você fez é bom. Gostaria apenas de sugerir algumas pequenas melhorias. Um seria para colocar a chamada de ciclo em post_classes. Para facilitar a leitura, eu faria post_classes aceitar o argumento Post. Isso cria um pouco de redundância, mas você pode facilmente evitá-lo, definindo este método auxiliar:

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

Assim, o código do modelo será parecido com este:

.post{:class => classes(Post)}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top