web-dev-qa-db-fra.com

Si autres instructions dans .html.erb dans les vues

Dans Rails, je rencontre souvent la situation où, dans les vues, je vais faire quelque chose comme

<% if @some_condition_previusly_established_in_a_controller %>
 <div class="one">123</div>
<% else %>
 <div class="two">something else</div>
<% end %>

Cela semble un peu clouté. Est-ce une manière acceptable de travailler avec des vues ou pas?

39
dsp_099

À moins que vous ne trouviez un moyen de réécrire cela comme une méthode d'assistance, vous êtes fondamentalement coincé avec ça, ça a l'air un peu moche. C’est exactement ce qu’est ERB, qui devait être un moyen minimal d’injecter Ruby) dans un modèle de texte en clair, et non comme quelque chose de plus simple et élégant.

La bonne nouvelle est qu’un éditeur de coloration syntaxique rendra votre <% ... %> _ Les blocs ERB sont visuellement différents de votre code HTML, ce qui améliore considérablement la lisibilité.

C’est aussi pourquoi d’autres représentations comme HAML ont été créées alors que leur syntaxe est beaucoup moins encombrée:

- if some_condition_previusly_established_in_a_controller
  .one 123
- else
  .two something else
22
tadman

Pour une ou deux de ces logiques conditionnelles dans vos vues, je suppose que c'est correct, mais lorsque votre code grossit et que vous avez plusieurs if..else..end et ressemble à "cluttery", je pense que vous devriez envisager de mettre en oeuvre "Presenter Pattern" qui nettoie considérablement vos points de vue en séparant votre logique des présentateurs.

Voici un excellent tutoriel que j'ai suivi de Ryan Bates dans sa série Rails Casts sur "Presenter Patterns from scratch"). http://railscasts.com/episodes/287-presenters- à partir de zéro .

9
vee

As-tu essayé?

<% @some_condition_previusly_established_in_a_controller ? <div class="one">123</div> : <div class="two">something else</div> %>
5
ajthewebdev

Si votre vue contient beaucoup de balises et d’éléments HTML, vous pouvez les mettre en partiels et la logique dans le modèle.

Vue:

<%= render :partial => @model.status %>

<%= render :partial => "file/path/#{@model.status}" %> # if your partial is in some different folder

Si votre statut est à un, le fichier _one.html.erb sera alors rendu.

S'il en existe deux, le fichier _two.html.erb sera alors rendu automatiquement.

Modèle:

def status
    if @some_condition
      "one"
    else
      "two"
    end
end
5
Sunda

Oui, c’est la norme (et oui, c’est tout.

Si vous recherchez une alternative plus propre, consultez: Encapsulation de balise conditionnelle dans Rails/ERB

1
Rebitzele