Railstutorial:将flash消息放入部分产生错误“未定义的方法`每个'为nil:NilClass”?

时间:2012-11-25 13:13:37

标签: ruby-on-rails ruby ruby-on-rails-3 railstutorial.org partials

  

可能重复:
  Flash Messages in Partials (Rails 3)

我在做Michael Hartl的Railstutorial,listing 7.26在应用程序布局中添加了flash消息:

<!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 %>

...打破flash消息的工作(因为'如果flash'总是为false)。

我有两个相关的问题:

  1. 为什么/如何使用partials / flash解决方案改变rails应用的行为?

  2. 如何更改我的局部/闪光以便它可以正常工作?

  3. 谢谢!

1 个答案:

答案 0 :(得分:3)

使用params / values的散列设置locals以传递给部分

<%= render :partial => "partials/flash", :locals => {:flash => flash} %>