2010-03-04 16 views
31

Non sono sicuro se sto facendo l'approccio migliore qui, ma ho un blocco di dati che voglio mostrare dopo che una ricerca è stata fatta e non esserci affatto prima. Prima di tutto, non c'è nulla da mostrare, e in secondo luogo il modello a cui fa riferimento è nullo, quindi lancia un'eccezione.Ruby on Rails: visualizza condizionatamente un parziale

Ho inserito questo blocco in un modello parziale e l'ho aggiunto nel punto corretto del layout. C'è un modo per rendere pulito il parziale in modo condizionale? C'è un modo migliore per affrontare questo problema?

risposta

41

Rubino ti permette di fare cose belle come questo:

<%= render :partial => "foo/bar" if @conditions %> 

per rendere questo un po 'più facile da leggere e capire, può essere scritta come:

<%= render(:partial => "foo/bar") if @conditions %> 

render è una funzione, e tu gli passi un hash che gli dice quale render parziale. Ruby ti permette di mettere le cose su una riga (che spesso le rende più leggibili e concise, specialmente nelle viste), quindi la sezione if @conditions è solo una normale istruzione if. Può anche essere fatto come:

<% if @conditions %> 
    <%= render :partial => "foo/bar" %> 
<% end %> 

Edit:

rubino permette inoltre di utilizzare la parola chiave unless al posto di if. Questo rende il codice ancora più leggibile e ti impedisce di fare confronti negativi.

<%= render :partial => "foo/bar" if [email protected] %> 
#becomes 
<%= render :partial => "foo/bar" unless @conditions %> 
+0

'<% = render: partial =>" foo/bar "a meno che @conditions%>' sia la concisione che stavo cercando. E, per quanto riguarda il tuo commento qui di seguito, sono d'accordo sul fatto che sarebbe sciocco essere completamente dogmatici sulla separazione delle preoccupazioni. Questo è in realtà un motivo per cui Rails rappresenta la flessibilità rispetto a un sistema come Django. Ma mi piace limitarlo quando possibile. I flashback da incubo ai miei giorni facendo l'asp classico, immagino. Grazie per l'aiuto! –

+0

Nessun problema. La parte difficile da passare da qualcosa come ASP sta definendo dove termina la tua applicazione/business logic, e dove inizia la logica della vista. –

5

Un modo semplice è utilizzare un metodo di supporto. Gli helper tendono ad essere un po 'più puliti della logica direttamente nella visualizzazione.

Quindi, la vista potrebbe essere qualcosa di simile:

<%= render_stuff_conditionally %> 

e il vostro aiuto avrebbe un metodo per controllare questo:

def render_stuff_conditionally 
    if @contional_check 
    render :partial => 'stuff' 
    end 
end 

dove ovviamente le cose sono chiamate in modo più appropriato

+0

D'accordo, mettere la logica in un aiuto è la cosa migliore. – bojo

+1

Non sono d'accordo. C'è una netta differenza tra la logica del controller e la logica della vista, e questa è la logica della vista. Può essere realizzato come un conciso one-liner come ho suggerito. Questa opzione rende solo più difficile scoprire quali condizioni vengono controllate durante il debug o la manutenzione del codice. –

+2

Penso che valga la pena considerare la situazione e ciò che stai effettivamente guadagnando dall'usare o meno un aiutante. Se il codice che stai considerando di inserire in un aiutante migliorerà la leggibilità della vista, potrebbe essere utile per te. Se si lascia il condizionale (o qualsiasi altro codice) all'interno della vista si presta a rendere il codice più leggibile e gestibile, è necessario prendere in considerazione anche questo. Gli helper possono diventare un catch-all per tutti i tipi di codice, in tal caso il tuo codice di visualizzazione potrebbe essere bello ma hai appena "spremuto il palloncino" (e il pasticcio non è andato via). – Tass

1

Assumendo Ti sto seguendo bene, lo fai a livello di vista.

<% if [email protected]_search_data.nil? %> 
<% render :partial => 'foo/bar' %> 
<% end %> 

Spero che questo aiuti. In caso contrario, inserisci un esempio del tuo codice.

+1

Questo è in realtà ciò che ho fatto mentre attendevo una risposta. Funziona, ma preferisco evitare la logica condizionale in una vista se ragionevolmente possibile. –

+0

La soluzione di Pete è il modo migliore per andare in quel caso. – bojo

+0

@Donald: Non c'è motivo di evitare la logica nelle visualizzazioni. C'è una linea sottile tra "view logic" e "application logic". –