Rails 3 - уведомление и мигание ошибок не могут быть отображены в частичном

Я пытался очистить application.html.erb, перемещая части макета в партиалы. У меня был следующий код для обработки ошибок/уведомлений флэш-памяти:

<div id="flash">
  <% if flash[:notice] %>
    <h3 class="info_box"><%= flash[:notice] %></h3>
  <% end %>
  <% if flash[:error] %>
    <h3 class="error_box"><%= flash[:error] %></h3>
  <% end %> 
</div>

Этот код отлично работал в application.html.erb, пока я не переместил его в файл с именем "_flash.html.erb" и не заменил его следующим:

<%= render 'layouts/flash' %>

В частичном хэше флэш-памяти не было распознанного объекта, и это вызывает "У вас есть нулевой объект, когда вы этого не ожидали!" ошибка.

Я переместил код обратно в application.html.erb, и все хорошо. Но я не смог найти ответ на доступ к флэш-хэшу в партиале. Глядя на Rails Guide для «Rendering and Layouts», я вижу, что существуют различные способы для render() передавать переменные в партиал, но мне не удалось понять это. Любые идеи?


person Don Leatham    schedule 05.11.2011    source источник
comment
Вы пробовали <%= render :partial => 'layouts/flash' %> ? Кроме того, откуда вы звоните этому render? И, я бы сказал, держите этот фрагмент вне макетов.   -  person Zabba    schedule 06.11.2011
comment
Вы определенно можете указать локальные переменные для партиала, например: render 'layouts/flash, :locals => {:flash => flash}. Но я не знаю, действительно ли это лучший вариант.   -  person topek    schedule 06.11.2011
comment
Забба и Топек - спасибо за предложения, к сожалению, ни то, ни другое не работает. Оба предложения ведут к следующему: у вас есть нулевой объект... Это действительно сбивает с толку!   -  person Don Leatham    schedule 06.11.2011


Ответы (2)


Решение Голиатона, казалось, сработало, но в конце концов оно не сработало. Я обнаружил, что причина, по которой это не работает для меня, заключается в том, что я назвал свой частичный файл _flash. Судя по всему, Rails создает локальную переменную для партиала, используя имя партиала (без символа "_"). Так что у меня возник конфликт переменных. Как только я изменил имя партиала на что-то отличное от _flash, все заработало отлично. Я нашел ответ здесь: Rails flash[:notice] всегда ноль

person Don Leatham    schedule 17.01.2012

Вы можете поместить условную проверку для flash в макет, и если он существует, то отрисовать партиал:

<%= render 'layouts/flash' unless flash.nil?%>

Затем, если он существует, он будет отображаться, как ожидалось.

person goliatone    schedule 09.12.2011
comment
Спасибо голиатон! Это прекрасно работает, но меня смущает. Ruby/Rails не выдает ошибку nil-object для if flash[:notice], пока он находится в application.html.erb, но когда if flash[:notice] находится в партиале, выдается ошибка nil-object! Очень странно! Это почему? - person Don Leatham; 17.01.2012
comment
flash является объектом ‹ActionDispatch::Flash::FlashHash:0x00000004d1f278 @used=#‹Set: {:notice}›, @closed=false, @flashes={}, @now=nil› ... так что это не будет нулем .. даже если нет флеш-сообщения - person equivalent8; 14.06.2012