试图使用Rails会话闪存,但得到nil。[]错误?

时间:2011-09-23 17:24:39

标签: ruby-on-rails

<%# 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。该错误位于代码段的第2行,它尝试访问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 个答案:

答案 0 :(得分:10)

这里的关键是你试图访问部分内的闪存。您需要在render方法中执行以下操作,以将flash哈希传递给partial:

render YOUR_PARTIAL, :flash => flash

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

修改

更简单的解决方案:将您的部分重命名为除_flash之外的所有内容。

因为你的部分名为flash,所以发生了这种情况:

  

每个partial也有一个局部变量,其名称与partial(减去下划线)相同。您可以通过:object选项将对象传递给此局部变量:

flash对象被使用部分名称创建的局部变量覆盖。

为了澄清这一点,假设您有一个评论模型并且您在部分中呈现评论,您可以执行以下操作:

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

你可以通过以下方式来做这个部分:

render @customer

现在用flash替换customer一词,你会明白为什么这是一个问题。

通常方便的功能是导致此问题的原因。