Флэш-сообщения в 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 объект из частичного, как и следовало ожидать в любом обычном представлении.

Другие вопросы по тегам