Flash-сообщения в Partials (Rails 3) - PullRequest
25 голосов
/ 24 июня 2010

У меня есть частичное, _flash.html.haml

- flash.each do |type, value|
  .flash{ :class => type.to_s }
    = value 

Который я рендеринг из вида, используя

=render :partial => "flash"

Который жалуется, что флеш-хэш равен нулю / не определен. Однако, когда я делаю это:

=render :partial => "flash", :locals => {:flash => flash}

Работает.

Почему частичное не имеет доступа к флэш-сообщению?

Ответы [ 4 ]

24 голосов
/ 04 октября 2010

В предыдущих версиях Rails (Rails 2) локальная переменная по умолчанию искала переменную экземпляра с тем же именем, что и частное в родительском.

Учитывая ваш пример, так как частичное имя имеет имя _flash, оно автоматически передаст переменную экземпляра flash как локальную для частичного.Таким образом, у вас будет доступ к нему.Это поведение устарело в 2.3 и было удалено в Rails 3.0.

Это означает, что вам всегда нужно явно передавать все переменные экземпляра как locals, даже flash, как вы писали в своем последнем примере.

<%= render :partial => "flash", :locals => {:flash => flash} %>

Это не имеет ничего общего с flash, скажем, flash - переменная экземпляра, как и любая другая.

22 голосов
/ 04 марта 2011

Поскольку ваш частичный элемент называется "_flash", у вас должен быть: object local для указания переменной flash внутри частичного элемента.

Измените частичное имя, и вы сможете использовать flash внутри, например:

= render "show_flash_names"
5 голосов
/ 18 сентября 2012

Каждое частичное отображается в контексте, который содержит неявную локальную переменную, имя которой является именем частичного (исключая начальное подчеркивание). Таким образом, _flash.html.haml частичное будет всегда иметь flash локальный, который затеняет ActionView::Base#flash. Если вы не передаете аргумент частному (через :locals => {:flash => flash} или :object => flash, значение local будет просто nil.

Как и предполагалось, вы можете переименовать частичное, чтобы избежать конфликта имен, или использовать более подробные вызовы render.

На мой взгляд, это досадная ошибка в Rails, и Я бы хотел, чтобы она изменилась .

4 голосов
/ 28 февраля 2012

Это также приведет к желаемому результату:

<%= render partial: "flash", object: flash %>

Объект flash передается партиалу admin/shared/flash как flash, поскольку партиал называется flash. У вас будет доступ к flash объекту внутри партиала, как и следовало ожидать в любом обычном представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...