2011-11-01 14 views
8

Non riesco a capire perché le mie viste delle rotaie non riconoscono il flash [: avviso] o il flash [: errore]. Continuo a ricevere il seguente errore relativo alla vista parziale in fase di rendering. L'errore specifico è:Rails flash [: notice] sempre nil

ActionView :: Template :: Error (Hai un oggetto nullo quando non ti aspettavi che Ci si sarebbero aspettati un'istanza di Array è verificato L'errore durante la valutazione nil []!..):

Nel mio controller ho

def index 
    @organisms = Organism.all 
    flash[:error] = "test" 
    flash[:notice] = "test" 
    respond_to do |format| 
     format.html 
     format.json { render :json => @organisms } 
    end 
    end 

Nel mio file index.html.erb ho rendere un parziale attraverso:

<%= render "shared/flash" %> 

Il partial ha il seguente codice.

<div id="flashes"> 

    <% if flash[:notice] %> 
    <p id="flash_notice" class="messages notice"><%= flash[:notice] %></p> 
    <%= javascript_tag "$('#flash_notice').effect('highlight',{},1000);" %> 
    <% end %> 
    <% if flash[:error] || flash[:errors] %> 
    <p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p> 
    <%= javascript_tag "$('#flash_errors').effect('highlight',{},1000);" %> 
    <% end %> 

    <% flash[:error] = flash[:errors] = flash[:notice] = nil %> 
</div> 

Tuttavia, se invece di rendere il parziale butto in <% = preavviso%> rende il preavviso.

Se prendo il codice parziale e lo inserisco nella parte superiore del file index.html.erb viene visualizzato correttamente. Quindi, presumo che sto rendendo la vista parziale in modo errato?

Qualsiasi aiuto è molto apprezzato. Grazie!

+1

Stai perdendo la parte fondamentale: come si sta rendendo il parziale. Inoltre, non disinserire il flash in basso. Rails lo fa già per te. –

+0

Grazie per le informazioni. Ho aggiunto come sto rendendo il parziale. –

+1

Non è necessario eseguire questa operazione <% flash [: error] = flash [: errors] = flash [: notice] = nil%> –

risposta

26

Non nominare il flash parziale. Ruby on Rails crea una variabile locale con lo stesso nome del partial. Nel tuo caso, viene creata una variabile locale flash.

Rinomina il tuo parziale in qualcosa di diverso dal flash e dovrebbe funzionare.

Inoltre, non è necessario impostare il flash su zero nella parte inferiore del parziale. Lascia che Rails si prenda cura di te per te.

+0

Il nome del partial "_flash" era il mio problema. Grazie Robert per averlo indicato. Non l'avrei mai capito. –

+0

Grazie, grazie! Non l'avrei mai capito neanche ... – deivid

2

si deve passare il flash alla parziale:

<%= render 'shared/flash', flash: flash %> 

o un po 'più a lungo:

<%= render partial: 'shared/flash', locals: { flash: flash } %> 
Problemi correlati