Пытаетесь использовать сессионную флешку Rails, но получаете ошибки nil. []? - PullRequest
5 голосов
/ 23 сентября 2011
<%# Flash-based notifications %>
<% if flash[:error].present? or flash[:notice].present? %>
  <div class="messages <%= flash[:error] ? 'error' : 'notice' %>">
    <ul id="feedback">
      <% if flash[:error].present? %>
        <li><%= flash[:error] %></li>
      <% end %>
      <% if flash[:notice].present? %>
        <li><%= flash[:notice] %></li>
      <% end %>
    </ul>
  </div>
<% end %>

По какой-то простой причине моя попытка чтения из флэш-памяти внутри частичной записи приводит к этой ошибке, поскольку для флэш-памяти установлено значение nil. Нужно ли инициализировать его вручную или что-то еще?

Это Rails 3.1.0. Ошибка находится во второй строке фрагмента кода, где он пытается получить доступ к flash[:error].

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

Я должен что-то упустить. Я определенно нигде не отменяю это.

1 Ответ

10 голосов
/ 23 сентября 2011

Ключевым моментом здесь является то, что вы пытаетесь получить доступ к вспышке внутри частичного.Вам нужно сделать следующее в вашем методе рендеринга, чтобы передать флеш-хэш в частичное:

render YOUR_PARTIAL, :flash => flash

http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables

РЕДАКТИРОВАТЬ:

Более простое решение: переименуйте вашу частичку во что угодно, кроме _flash.

Поскольку ваша частичная часть была названа flash, это случилось:локальная переменная с тем же именем, что и частичное (минус подчеркивание).Вы можете передать объект в эту локальную переменную с помощью опции: object:

Перезаписываемый объект был перезаписан локальной переменной, созданной с именем партиала.

Комупоясним это немного, скажем, у вас есть модель комментариев, и вы визуализируете комментарии в частичном, вы можете сделать что-то вроде:

#_comment.html.erb
<h1>comment.user.name</h1>
<p>comment.body</p>

Вы бы назвали этот частичный, выполнив что-то вроде:

render @customer

Теперь замените слово customer на flash, и вы поймете, почему это было проблемой.

Эта функциональность, которая обычно обычно , является причиной этой проблемы.

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