2015-06-20 3 views
1

У меня есть стандартные флеш-сообщения по всему моему приложению, используя бутстрап для стилизации. Они отлично работают, но я хотел бы добавить функциональность.
Посетитель, который получает флеш-сообщение на своем экране, должен иметь возможность щелкнуть сообщение со вспышкой /, чтобы сообщение со вспышкой исчезло. Например, X в верхнем правом углу, который, если щелкнуть, удаляет флеш-сообщение. Возможно ли это (без javascript)? Я добавил свой текущий код, который не допускает такого поведения ниже. Как мне настроить свой код для этого поведения?Пусть флеш-сообщения исчезнут, щелкнув по нему, в Rails


В настоящее время я, например, иметь в своем контроллере:

flash.now[:info] = "Your subscription has expired" 

В application.html.erb:

<% flash.each do |message_type, message| %> 
    <%= content_tag(:div, message, class: "alert alert-#{message_type}") %> 
<% end %> 

И у меня есть частичное _error_messages.html.erb:

<% if object.errors.any? %> 
    <div id="error_explanation"> 
    <div class="alert alert-danger"> 
     The form contains <%= pluralize(object.errors.count, "error") %>. 
    </div> 
    <ul> 
    <% object.errors.full_messages.each do |msg| %> 
     <li><%= msg.html_safe %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 
+0

вы используете 'Devise'? – Pavan

+0

Нет, не используя Devise. – Nick

+0

Хм нормально. Добавьте это '' after 'content_tag' и проверить. – Pavan

ответ

2

Попробуйте придав ему нравится эта

<div class="alert alert-info alert-dismissible" role="alert"> 
    <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
    <% flash.each do |message_type, message| %> 
     <%= content_tag(:div, message, class: "alert alert-#{message_type}") %> 
    <% end %> 
</div> 

Update

Это должно работать

<% flash.each do |message_type, message| %> 
    <%= content_tag :div, class: "alert alert-#{message_type}" do -%> 
    <%= message %> 
    <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
    <% end -%> 
<% end %> 
+0

Не работает, так как кнопка должна быть в флешке div. – max

+0

Спасибо, это сработало. Единственным недостатком является стилизация. Первый div всегда появляется, также если нет флэш-сообщения. Первый 'div' принимает информационное флеш-сообщение, но это не относится ко всем флэш-сообщениям. И второй 'div' флеш-сообщения имеет границу внутри 1-го' div'. Но все это, конечно, можно адаптировать. – Nick

+0

Не быть кляпом, но почему бы просто не сделать это правильно? См. Мой ответ. – max

1

Единственное решение av ailable без использования javascript - это перезагрузка страницы, но это не жизнеспособное решение.

<% flash.each do |message_type, message| %> 
    <%= content_tag(:div, 
     message + link_to('x', request.path), 
     class: "alert alert-#{message_type}") 
    %> 
<% end %> 

Поскольку вспышки удаляются из сеанса после их отображения, не было бы сообщений со вспышкой.

Однако вы можете использовать функциональность javascript, встроенную в бутстрап, без фактического написания javascript (я украл это из комментария Павана).

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/> 
 

 
<div class="flashes"> 
 
    <div class="alert alert-info"> 
 
    You forgot the lights on! <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
 
    </div> 
 
    <div class="alert alert-warning"> 
 
    You forgot the stove on! <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
 
    </div> 
 
</div>

Добавлено:

Чтобы интегрировать это в ваше приложение Rails:

<% flash.each do |message_type, message| %> 
    <div class="<%= "alert alert-#{message_type}" %>"> 
    <%= message %> 
    <button type="button" class="close" data-dismiss="alert"> 
     <span aria-hidden="true">&times;</span> 
     <span class="sr-only">Close</span> 
    </button> 
    </div> 
<% end %> 

В то время как вы могли бы использовать content_tag и зубрить пролеты в это намного проще.

+0

Спасибо, я добавил код 'flash.each' в' application.html.erb'. Я не уверен, где добавить код 'button' в мой код. Не могли бы вы предложить? – Nick

+0

Добавлено предложение о внедрении – max

+0

По какой-то причине 'x' на экране не является кликабельным, просто текстовым. – Nick

Смежные вопросы