2011-07-21 13 views
5

Su un'applicazione Rails 3.1, ho un metodo chiamato user_logged_in? di Devise, che voglio utilizzare per rendere un partial in modo selettivo. Ecco il codice in layouts/application.html.erb:Rails 3, rendering parziale solo se un utente ha effettuato il login

<% if user_logged_in? %> 
<%= render :partial => "home/statusbar" %> 
<% end %> 

Utilizza un parziale da un controller diverso. Questa è la parziale:

<div id="status_bar"> 
    Signed in as <%= link_to current_user.name, edit_user_registration_path %> 
</div> 

verifica un errore in current_user.name (metodo non definito), perché è current_usernil. Potrei spostare il controllo user_logged_in? all'interno del parziale, ma penso che sarebbe marginalmente più efficiente se fosse nella vista.

Potrebbe dirmi quali sono le migliori pratiche o come posso superare l'errore del metodo non definito? È normale che Rails controlli il codice del modello anche se si trova in un blocco if che non riesce?

risposta

13

Sembra che user_logged_in? sia dove qualcosa non funziona. Funziona se si passa a questo?

<% if current_user.present? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 
+3

Sì, lo fa. Funziona anche se uso user_signed_in ?. Metodo totalmente sbagliato. Scusa e grazie! – joseph

1

Quel codice è in esecuzione, ruby ​​è anatra digitato e dinamico, tutti i controlli sono in fase di esecuzione. Quindi devi controllare il tuo condizionale. Prova

<% if false %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

e vedere se fallisce stll. Una soluzione bettter sarebbe

<% if current_user %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Sono familiarità con disposizione testamentaria, ma questo dovrebbe funzionare Da utente corrente wil essere nullo se nessuno è connesso in

+0

Hai ragione, dovevo usare user_signed_in, non user_logged_in! Grazie per la risposta informativa. – joseph

4

ho familiarità con Devise, ma non il metodo user_logged_in? - l'hai definito tu stesso? Il normale helper utilizzato nelle visualizzazioni è user_signed_in?. Inoltre, provare qualcosa di simile al seguente:

<% puts user_logged_in?.inspect %> 
<% puts user_signed_in?.inspect %> 

Sopra l'istruzione if nella vista, e controllare i log per assicurarsi che la chiamata sta tornando false correttamente (user_signed_in? dovrebbe anche ritorneremo false). Non dovresti ricevere un errore nullo in quel parziale, a meno che non sia effettivamente sottoposto a rendering (nel senso che il codice è entrato nell'istruzione if).

0

C'è un modo ancora più breve per rendere il vostro parziale con un condizionale

<%= render(partial: "home/statusbar") if current_user.present? %> 
1

ho trovato la soluzione, sembra che

user_logged_in? 

non è più usato, e invece è necessario utilizzare

user_signed_in? 

Quindi, con il codice che ha dato questo dovrebbe funzionare:

<% if user_signed_in? %> 
    <%= render :partial => "home/statusbar" %> 
<% end %> 

Questo codice ha reso parziale per me.

Problemi correlati