2011-11-01 12 views
8

No puedo entender por qué mis vistas de rieles no reconocen flash [: notice] o flash [: error]. Sigo recibiendo el siguiente error con respecto a la vista parcial que se está procesando. El error específico es:Rails flash [: notice] always nil

ActionView :: :: Plantilla de error (Usted tiene un objeto nulo cuando no lo esperas Uno podría esperar una instancia de matriz se produjo el error mientras que la evaluación nula []!..):

En mi controlador tengo

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

En mi archivo index.html.erb pagaré un parcial a través de:

<%= render "shared/flash" %> 

El parcial tiene el siguiente código.

<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> 

Sin embargo, si en lugar de hacer que el parcial lanzo en <% = aviso%> se rinde a cabo la notificación.

Si tomo el código parcial y lo pego en la parte superior del archivo index.html.erb se representa correctamente. Por lo tanto, supongo que estoy representando la vista parcial de forma incorrecta.

Cualquier ayuda es muy apreciada. ¡Gracias!

+1

Te falta la parte clave: cómo se está haciendo el parcial. Además, no desarme el flash en la parte inferior. Rails ya lo hace por ti. –

+0

Gracias por la información. Agregué cómo estoy renderizando el parcial. –

+1

u no necesita hacer esto <% flash [: error] = flash [: errors] = flash [: notice] = nil%> –

Respuesta

26

No nombre su flash parcial. Ruby on Rails crea una variable local con el mismo nombre que el parcial. En su caso, se está creando una variable local flash.

Cambie el nombre de su parte parcial a algo distinto de flash y debería funcionar.

Además, no debería necesitar configurar flash a cero en la parte inferior de su parcial. Deja que Rails se encargue de eso por ti.

+0

Nombrar el "_flash" parcial fue mi problema. Gracias Robert por señalar esto. Nunca lo hubiera averiguado. –

+0

Gracias, gracias, gracias! Nunca lo hubiera averiguado tampoco ... – deivid

2

usted tiene que pasar el flash en el parcial:

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

O un poco más de tiempo:

<%= render partial: 'shared/flash', locals: { flash: flash } %> 
Cuestiones relacionadas