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

следующий код отображает сообщения Rails flash с помощью 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 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, чтобы взломать этот код?

2 ответов


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

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

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

под Rails 4.0 клавиша является символом.

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

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

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

чтобы исправить это, код для отображения флэш-сообщений с 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' %>">

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

<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