Неверный цвет для флеш-сообщений под 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">×</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">×</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">×</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