Сообщения Flash в частицах (Rails 3)
У меня есть частичный,
_flash.html.haml
- flash.each do |type, value|
.flash{ :class => type.to_s }
= value
Что я просматриваю из представления с помощью
=render :partial => "flash"
Что жалуется, что флэш-хэш равен нулю / undefined. Однако, когда я это делаю:
=render :partial => "flash", :locals => {:flash => flash}
Он работает.
Почему частичные не имеют доступа к флэш-сообщению?
Ответы
Ответ 1
В предыдущих версиях Rails (Rails 2) локальная переменная по умолчанию могла искать переменную экземпляра с тем же именем, что и частичное в родительском.
Учитывая ваш пример, так как частичный с именем _flash
, он автоматически передает переменную-экземпляр экземпляра как локальную частицу. Таким образом, у вас будет доступ к нему. Это поведение было устаревшим в версии 2.3 и было удалено в Rails 3.0.
Это означает, что вы всегда должны явно передавать все переменные экземпляра как locals
, даже flash
, как вы писали в последнем примере.
<%= render :partial => "flash", :locals => {:flash => flash} %>
Это не имеет никакого отношения к flash
per say, flash
- это переменная экземпляра, как и любая другая.
Ответ 2
Поскольку ваш частичный объект называется "_flash", вы должны иметь локальный объект: local, чтобы указать переменную flash внутри частичного.
Измените свое частичное имя, и вы сможете использовать flash внутри, например:
= render "show_flash_names"
Ответ 3
Каждый фрагмент визуализируется в контексте, который содержит неявную локальную переменную, имя которой является частью частичного (исключая главный подчеркивание). Таким образом, _flash.html.haml
partial будет всегда иметь локальный flash
, который тени ActionView::Base#flash
. Если вы не передадите аргумент частичным (либо через :locals => {:flash => flash}
, либо :object => flash
, значение local просто nil
.
Как и было предложено, вы можете переименовать частичное, чтобы избежать конфликта имен, или использовать более подробные вызовы render
.
Это раздражающая неуместность Rails, на мой взгляд, и Я бы хотел, чтобы это изменилось.
Ответ 4
Это также достигнет желаемого результата:
<%= render partial: "flash", object: flash %>
Объект flash
передается в admin/shared/flash
partial как flash
, так как частичный называется flash
. У вас будет доступ к объекту flash
из частичного, как вы ожидали бы, в любом регулярном представлении.