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