Неверный цвет для флеш-сообщений под Rails 4.1 с помощью Bootstrap или Foundation

В следующем коде отображаются флеш-сообщения Rails с использованием Bootstrap 3.0:

<%# Rails flash messages styled for Twitter Bootstrap 3.0 %>
<% flash.each do |name, msg| %>
  <% if msg.is_a?(String) %>
    <div class="alert alert-<%= name == :notice ? "success" : "danger" %>">
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      <%= content_tag :div, msg, :id => "flash_#{name}" %>
    </div>
  <% end %>
<% end %>

Код из статьи Bootstrap и Rails.

Аналогичный код из статьи Foundation and Rails можно использовать с Foundation:

<%# Rails flash messages styled for Zurb Foundation 5.0 %>
<% flash.each do |name, msg| %>
  <% if msg.is_a?(String) %>
    <div data-alert class="alert-box round <%= name == :notice ? "success" : "alert" %>">
      <%= content_tag :div, msg %>
      <a href="#" class="close">&times;</a>
    </div>
  <% end %>
<% end %>

Как для Bootstrap, так и для Foundation, при обновлении моего приложения с Rails 4.0 до Rails 4.1 все флэш-сообщения отображаются красными, даже "уведомляющими" сообщениями, которые должны отображаться зеленым цветом.

Что изменилось в Rails 4.1, чтобы разбить этот код?

Ответы

Ответ 1

Нашел свой собственный ответ...

Я пересмотрел учебник Rails и Bootstrap и обновил пример приложения rails-bootstrap.

Хеш-сообщение с флагом Rails содержит ключ ( "имя" ) и значение ( "сообщение" ).

В разделе Rails 4.0 ключ является символом.

В разделе Rails 4.1 ключ представляет собой строку.

Стилирование флэш-сообщений для отображения с помощью Bootstrap или Foundation требует разбора ключа, чтобы определить, является ли это предупреждением или уведомлением.

В разделе Rails 4.1 имена являются строками и не соответствуют указанному выше коду, вместо этого они становятся красными с классом опасности предупреждения.

Чтобы исправить это, код для отображения флеш-сообщений с Bootstrap должен измениться, чтобы разместить как Rails 4.0, так и Rails 4.1:

<div class="alert alert-<%= name.to_s == 'notice' ? 'success' : 'danger' %>">

Для Foundation код должен измениться на следующее:

<div data-alert class="alert-box round <%= name.to_s == 'notice' ? 'success' : 'alert' %>">

Ответ 2

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

<div class="container">
  <% flash.each do |name, msg| %>
    <% if msg.is_a?(String) %>
      <div class="alert alert-<%= flash_class_name(name) %>" role="alert">
        <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span>
        <span class="sr-only">Close</span>
        </button>
        <%= content_tag :div, msg, :id => "flash_#{name}" %>
      </div>
    <% end %>
  <% end %>
</div>

и вспомогательный метод

def flash_class_name(name)
    case name
    when 'notice' then 'success'
    when 'alert'  then 'danger'
    else name
    end
end