2011-09-23 6 views
5
<%# Flash-based notifications %> 
<% if flash[:error].present? or flash[:notice].present? %> 
    <div class="messages <%= flash[:error] ? 'error' : 'notice' %>"> 
    <ul id="feedback"> 
     <% if flash[:error].present? %> 
     <li><%= flash[:error] %></li> 
     <% end %> 
     <% if flash[:notice].present? %> 
     <li><%= flash[:notice] %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

Por alguna razón, tan simple como parece, mi intento de leer desde el flash dentro de un parcial está produciendo este error, porque el flash está configurado en nil. ¿Debo inicializarlo manualmente o algo así?¿Intenta usar la sesión flash de Rails, pero obteniendo errores nil. []?

Esto es Rails 3.1.0. El error está en la línea 2 del fragmento de código, donde intenta acceder al flash[:error].

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.[] 

Me debe estar faltando algo. Definitivamente no lo estoy anulando en ninguna parte.

Respuesta

10

La clave aquí es que está tratando de acceder al flash dentro de un parcial. Usted tendrá que hacer lo siguiente en su método render para pasar el hash de flash a través de la parcial:

render YOUR_PARTIAL, :flash => flash 

http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables

EDIT:

fácil solución: cambiar el nombre parcial a nada pero _flash.

Debido a que su parcial fue llamado flash, esto sucedió:

Cada parcial también tiene una variable local con el mismo nombre que el parcial (menos el subrayado). Puede pasar un objeto a esta variable local a través de la opción: objeto:

El objeto flash fue sobrescrito por una variable local creada con el nombre del parcial.

Para aclarar esto un poco, digamos que usted tiene un modelo de comentario y tu render los comentarios en el parcial, es posible hacer algo como:

#_comment.html.erb 
<h1>comment.user.name</h1> 
<p>comment.body</p> 

Se podría llamar a este parcial por hacer algo a lo largo de las líneas de:

render @customer 

Ahora reemplace la palabra cliente con flash y verá por qué esto era un problema.

Esta funcionalidad que es generalmente conveniencia es lo que causó el problema.

+0

Pensé que los ayudantes de vista podían acceder a mis parciales. Todos mis ayudantes de aplicaciones ciertamente lo son. Voy a dar una oportunidad, gracias. – d11wtq

+0

En realidad, después de leer ese enlace, su parcial no se llama _flash ¿verdad? Si es así, cambie el nombre a literalmente cualquier otra cosa y vea si eso funciona. – Gazler

+0

Bueno, eso ciertamente lo soluciona. Supongo que no entiendo completamente de dónde viene 'flash'. Mirando el middleware es un método en la Solicitud. Supuse que estaba expuesto como un ayudante de visualización porque es accesible para la vista :) – d11wtq

Cuestiones relacionadas