Подтвердить что ты не робот

Сообщения 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}

Он работает.

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

4b9b3361

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