6

重複の可能性:
パーシャルのフラッシュメッセージ(Rails 3)

私はMichaelHartlの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

重要な問題は、フラッシュがnilであるということのようです。これは、_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 %>

...フラッシュメッセージの動作を中断します(「フラッシュの場合」は常にfalseであるため)。

関連する質問が2つあります。

  1. パーシャル/フラッシュソリューションを使用すると、Railsアプリの動作がどのように正確に変わるのですか?

  2. パーシャル/フラッシュを変更して機能させるにはどうすればよいですか?

ありがとう!

4

1 に答える 1

4

パーシャルに渡すパラメータ/値のハッシュを使用してローカルを設定します

<%= render :partial => "partials/flash", :locals => {:flash => flash} %>
于 2012-11-25T14:27:08.463 に答える