2013-06-24 8 views
13

Rails offre un modo per uscire in anticipo o "tornare" da una vista che viene sottoposta a rendering?C'è un modo per fare un'uscita anticipata o "tornare" da una vista in Rails?

Ad esempio, ho una visione strutturata come segue:

<h1>Your records summary</h1> 

<% if @current_user.has_records? %> 
    <p>You don't have any records.</p> 
<% else %> 
    ... long block of view emission code here ... 
<% end %> 

Nel codice non-erb, avevo appena return da quella if condizione, e non avrebbe bisogno di metterlo blocco lungo all'interno di un else. Sembrerebbe:

<h1>Your records summary</h1> 

<% if @current_user.has_records? %> 
    <p>You don't have any records.</p> 
    <% return (or something) %> 
<% end %> 
... long block of view emission code here ... 

C'è un modo per fare qualcosa di simile in ERB?

EDIT: Per essere chiari, Non sto chiedendo per alternano approcci, come ad esempio sono state suggerite. Non sono un noob Rails. Voglio solo sapere se Ruby fornisce un meccanismo per ciò che ho suggerito o no.

+0

Non proprio, ma IMO sarebbe probabilmente l'approccio sbagliato comunque. Considera invece l'uso di modelli diversi e/o parziali. –

+0

"No" è una risposta perfettamente accettabile. Non posso "accettare" un commento, comunque. –

+0

StackOverflow richiede almeno 15 caratteri per un commento/risposta. Quindi un semplice "no" non è possibile. ;) – lurker

risposta

4

IIRC non esiste un meccanismo incorporato per uscire anticipatamente da un modello. Questo è in linea con il modo in cui (penso) dovrebbe comportarsi un livello di vista, sebbene erb non sia un motore di template.

La vecchia soluzione era quella di avvolgere il modello in un catch e lanciare qualcosa all'interno del modello, come un simbolo.

È anche possibile incorporare l'eval all'interno di una lamba, consentendo di utilizzare return.

Ancora ew, comunque.

+2

L'idea di usare un try/catch è un po 'esilarante. –

2

Il modo migliore è gestire il condizionale nel controller prima di renderizzare il modello. Qui puoi anticipare lo return un modello diverso (come il modulo Aggiungi record) o il modello dei risultati.

È anche possibile scaricare la logica in JavaScript nella vista stessa.

+0

Grazie, ma lo so. Non stavo chiedendo un approccio alternativo. Sto solo chiedendo se ciò che ho suggerito è possibile. –

4

In Rails 3.2.2, il ritorno all'interno di un modello funziona bene per me.

<% return unless allowed_tags %> 
+0

Ho usato questo metodo anche prima. Qualcuno può dare un lato negativo ad esso? –

+3

@Gerry, markup prima che l'istruzione return non venga visualizzata nei casi in cui viene eseguito il ritorno. – psparrow

+0

Ah, grazie @psparrow. Se lo uso, l'ho fatto solo nella parte superiore di una vista prima che qualsiasi mark up sia stato renderizzato, quindi non l'ho mai notato. –

Problemi correlati