2013-07-22 12 views
32

In Schienen, oft ich in die Situation kommen, wo die Ansichten innerhalb ich etwas tun werde, wieWenn andere Aussagen in .html.erb in Ansichten

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

Es sieht ein bisschen cluttery. Ist das eine akzeptable Art, mit Ansichten zu arbeiten oder nicht?

+9

können Sie <% -%> verwenden Leerzeilen zu vermeiden, zu dem resultierenden HTML-Code angehängt werden. –

Antwort

19

Wenn Sie einen Weg finden können neu schreiben dies als eine Hilfsmethode, sind Sie im Grunde mit ihm Art suchen stecken hässlich. So ist ERB, denn es sollte eine minimale Art sein, Ruby in eine ansonsten reine Textvorlage zu injizieren, nicht als etwas, das unbedingt schlank oder elegant ist.

Die gute Nachricht ist, dass ein Syntaxhervorhebungs-Editor normalerweise Ihre <% ... %> ERB-Blöcke visuell von Ihrem HTML unterscheidet, so dass die Lesbarkeit dramatisch verbessert werden kann.

Es ist auch, warum andere Darstellungen wie HAML erstellt wurden, in denen die Syntax viel weniger überladen ist:

- if some_condition_previusly_established_in_a_controller 
    .one 123 
- else 
    .two something else 
+2

Diese Art von Sachen ist, warum ich HAML über ERB bevorzuge. HAML beseitigt das Durcheinander. –

+0

Ich habe ein Problem mit HAML (ich benutze schlank). Die HAML-Syntax ist klar und prägnant, wenn Ihr HTML-Code kurz ist. aber es wird unordentlich, wenn der Code groß ist. Sie können auch nicht Code formatieren, wenn Sie einige IDE oder Plugins verwenden .... – hqt

+0

@hqt HAML ist ziemlich gut, bis Ihre Inline-Bits von Code zu riesig werden, es ist wahr, aber Sie können das normalerweise durch das Schreiben von Hilfsfunktionen minimieren, die wie viel Code minimieren Sie haben in Ihrer Vorlage. Wie Sie bemerken, gibt es auch andere HAML-ähnliche Meta-HTML-Notationssysteme. Wenn Sie also mit ERB unzufrieden sind, haben Sie Optionen. – tadman

9

Für eine oder zwei solche bedingte Logik in Ihren Ansichten, ich denke, seine Ordnung, aber wenn Ihr Code bekommt größer und Sie haben mehrere if..else..end und sieht "cluttery", ich denke, Sie sollten bei der Implementierung von "Presenter Pattern", die Ihre Ansichten durch die Trennung Ihrer Logik zu Presenter erheblich verbessert.

Hier ist ein tolles Tutorial, das ich von Ryan Bates in seiner Rails Casts-Serie auf "Presenter Patterns from scratch" verfolgt habe. http://railscasts.com/episodes/287-presenters-from-scratch.

+0

Nice Link, aber nicht zu denen von uns ohne ein kostenpflichtiges Konto sichtbar. = ( –

+0

) Ja, ich bin nur besorgt, wenn ich gegen die Urheberrechtsgesetze verstoße, wenn ich den Github-Quelllink gepostet habe, werde ich versuchen, einen Link zur Quelle zu veröffentlichen und meine Antwort so zu bearbeiten, dass sie die notwendigen Klassen und Dateien enthält wenn es mich nicht jagt :) – vee

+0

Es sieht so aus [Episode 287] (https://github.com/ryanb/railscasts-episodes/tree/master/episode-287) ist öffentlich in mindestens einem seiner Repos . –

-2

Sie können die Logik immer zum Controller verschieben und die Ansicht sauber lassen (er).

Controller:

if @some_condition 
    @div_class = :one 
    @div_content = 123 
else 
    @div_class = :two 
    @div_content = 'something else' 
end 

Ausblick:

<div class="<%= @div_class %>"><%= @div_content %></div> 

oder mit einem Helfer:

<%= content_tag :div, @div_content, class: @div_class %> 
3

Wenn Ihre Ansicht viele Tags und HTML-Elemente enthält, können Sie sie in setzen Teiltöne und Logik in Modell

Ausblick:

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

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

Wenn Ihr Status ist, dann wäre es die Datei _one.html.erb

machen Wenn es zwei ist, dann wäre es die Datei automatisch machen _two.html.erb.

Modell:

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