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


person Daniel Kehoe    schedule 01.03.2014    source источник
comment
Как выглядит сгенерированный HTML?   -  person Justin Wood    schedule 01.03.2014


Ответы (2)


Нашел свой ответ...

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

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

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

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

Стилизация флэш-сообщений для отображения с помощью 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' %>">
person Daniel Kehoe    schedule 01.03.2014
comment
Как это повлияет на такой код, как redirect_to some_path, notice: "My message"? Я устанавливаю свои флэш-сообщения в контроллере. - person Dennis; 12.04.2014
comment
Спасибо, что добавили это - person Kurt Funai; 19.04.2014
comment
Это было действительно полезно для меня - спасибо, что проследили и разместили правильный ответ. Вы должны отметить это как правильный ответ, чтобы его было легче заметить. Спасибо! - person JoshDoody; 26.04.2014
comment
это должно быть name.to_sym вместо name.to_s - person Steve; 29.03.2015

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

<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
person loubotics    schedule 12.10.2014