2013-07-22 12 views
32

In rotaie, ho spesso incontrano la situazione in cui dentro il punto di vista che farò qualcosa di simileSe else in .html.erb in vista

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

Sembra un po 'cluttery. È un modo accettabile di lavorare con le viste o no?

+9

È possibile utilizzare <% -%> per evitare righe vuote da aggiungere al codice HTML risultante. –

risposta

19

A meno che non si può pensare a un modo per ri-scrivere questo come un metodo di supporto, si sta praticamente bloccato con esso cercando tipo di brutta. È proprio così che ERB è, dato che doveva essere un modo minimale di iniettare Ruby in un modello altrimenti semplice, non come qualcosa di necessariamente snello o elegante.

La buona notizia è che un editor di evidenziazione della sintassi di solito rende i blocchi ERB <% ... %> visivamente diversi dal codice HTML in modo da migliorare notevolmente la leggibilità.

E 'anche per questo che altre rappresentazioni come HAML sono stati creati in cui che la sintassi è molto meno ingombrante:

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

Questo genere di cose è il motivo per cui preferisco HAML su ERB. HAML si libera della confusione. –

+0

Ho un problema con HAML (io uso slim). La sintassi HAML è chiara e concisa quando il codice html è breve. ma diventerà caotico quando il codice è grande. Non puoi anche formattare il codice quando usi alcuni IDE o plug-in .... – hqt

+0

@hqt HAML è abbastanza buono finché i tuoi bit di codice inline diventano troppo grandi, è vero, ma di solito puoi attenuarli scrivendo le funzioni di aiuto che riducono la quantità di codice hai nel tuo modello. Come fai notare, ci sono anche altri sistemi di notazione HTML come HAML, quindi se sei infelice con ERB hai delle opzioni. – tadman

9

per uno o due come logica condizionale nel vostro punto di vista, credo il suo bene, ma quando il codice ottiene più grande e hai più if..else..end e sembra "cluttery", penso che dovresti considerare l'implementazione di "Presenter Pattern" che ripulisce enormemente le tue viste separando la tua logica dai Presenter.

Ecco un ottimo tutorial che ho seguito da Ryan Bates nella sua serie di Rails Casts su "Presenter Patterns from scratch". http://railscasts.com/episodes/287-presenters-from-scratch.

+0

Collegamento piacevole ma non visibile a quelli di noi senza un account a pagamento. = ( –

+0

Sì, sono solo preoccupato di violare le leggi sul copyright se ho pubblicato il link github source, cercherò di pubblicare un link alla fonte e di modificare la mia risposta per includere le classi e i file necessari se non mi insegue :) – vee

+0

Sembra che [episodio 287] (https://github.com/ryanb/railscasts-episodes/tree/master/episode-287) sia pubblico in almeno uno dei suoi repository . –

3

Hai provato?

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

È sempre possibile spostare la logica sul controller e lasciare la vista pulita (er).

Controller:

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

Vista:

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

o utilizzando un aiutante:

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

Se la vista contiene un sacco di tag e gli elementi HTML, è possibile metterli in parziali e logica nel modello

Vista:

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

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

Se lo stato è uno, allora sarebbe rendere il file _one.html.erb

Se lo è due, allora renderebbe il file _two.html.erb automaticamente.

Modello:

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