Railstutorial: Помещение флэш-сообщений в частичное приводит к ошибке неопределенного метода «каждый» для nil: NilClass?

Возможный дубликат:
Flash-сообщения в Partials (Rails 3 )

Я изучаю Railstutorial Майкла Хартла и листинг 7.26 добавляет флэш-сообщения в макет приложения:

<!DOCTYPE html>
<html>
.
.
.
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |key, value| %>
        <div class="alert alert-<%= key %>"><%= value %></div>
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
    .
    .
    .
  </body>
</html>

Это прекрасно работает.

Однако я попытался очистить этот код, создав _flash.html.erb в моей частичной папке...

<% flash.each do |key,value| %>
  <%= content_tag(:div, value, class: "alert alert-#{key}") %>
  <!-- <div class="alert alert-<%= key %>"><%= value %></div> -->
<% end %>

...и чем использовать...

<%= render 'partials/flash' %>

... в моем макете приложения все мои тесты Rspec начинают давать сбой со следующим сообщением для каждого теста:

 Failure/Error: before { visit signup_path }
 ActionView::Template::Error:
   undefined method `each' for nil:NilClass

Ключевая проблема, по-видимому, заключается в том, что flash равен нулю, потому что моя частичная часть _flash заключена в операторе if, подобном этому...

<% unless flash.empty? %>
  <% flash.each do |key,value| %>
    <%= content_tag(:div, value, class: "alert alert-#{key}") %>
    <!-- <div class="alert alert-<%= key %>"><%= value %></div> -->
  <% end %>
<% end %>

... выдает то же сообщение об ошибке о NilClass, что и выше, и заключает его в оператор if, подобный этому...

<% if flash %>
  <% flash.each do |key,value| %>
    <%= content_tag(:div, value, class: "alert alert-#{key}") %>
    <!-- <div class="alert alert-<%= key %>"><%= value %></div> -->
  <% end %>
<% end %>

... прерывает работу флэш-сообщений (потому что «if flash» всегда ложно).

У меня два связанных вопроса:

  1. Почему и как именно использование решения partials/flash меняет поведение приложения rails?

  2. Как изменить мои частичные/вспышки, чтобы они работали?

Спасибо!


person Peter-Jan Celis    schedule 25.11.2012    source источник


Ответы (1)


Установите локальные переменные с хэшем параметров/значений для передачи частичному

<%= render :partial => "partials/flash", :locals => {:flash => flash} %>
person adc    schedule 25.11.2012