Rails: простой способ добавить несколько вспышек [: уведомление] за раз
Я думал, что каждый раз, когда вы делаете flash[:notice]="Message"
, он добавляет его в массив, который затем будет отображаться во время просмотра, но следующее просто сохраняет последнюю вспышку:
flash[:notice] = "Message 1"
flash[:notice] = "Message 2"
Теперь я понимаю, что это простой хэш с ключом (я думаю:)), но есть лучший способ сделать несколько вспышек, чем следующее:
flash[:notice] = "Message 1<br />"
flash[:notice] << "Message 2"
Ответы
Ответ 1
Сообщение flash
действительно может быть любым, что вы хотите, чтобы вы могли сделать что-то вроде этого:
flash[:notice] = ["Message 1"]
flash[:notice] << "Message 2"
И затем в ваших представлениях выведите его как
<%= flash[:notice].join("<br>") %>
Или что вы предпочитаете.
Этот метод проще других решений определяется вашими предпочтениями.
Ответ 2
Я обычно добавляю такие методы в свой ApplicationHelper:
def flash_message(type, text)
flash[type] ||= []
flash[type] << text
end
и
def render_flash
rendered = []
flash.each do |type, messages|
messages.each do |m|
rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank?
end
end
rendered.join('<br/>')
end
И после того, как их очень легко использовать:
Вы можете написать что-то вроде:
flash_message :notice, 'text1'
flash_message :notice, 'text2'
flash_message :error, 'text3'
в вашем контроллере.
И просто добавьте эту строку в свой макет:
<%= render_flash %>
Ответ 3
Я думаю, что идея, встроенная в структуру, заключается в том, что каждое сообщение, которое вы вставляете во флеш, переписывается. Вы даете каждому сообщению уникальный ключ, чтобы его можно было изменить или перезаписать.
Если вам нужно другое сообщение, не называйте его ": уведомление". Назовите каждое уникальное. Затем, чтобы отобразить флэш-сообщения, пропустите все, что находится в хеше.
Если это не сработает для вас, подумайте, действительно ли вам нужно упростить свой интерфейс.
Ответ 4
Хотя я согласен с Джонатаном в том, что пользовательскому интерфейсу может потребоваться некоторое упрощение, бывают случаи, когда вы можете отображать несколько сообщений для одного и того же ключа.
В результате я создал жемчужину, которая (должна) упростить работу с несколькими флэш-сообщениями в одном ключе и их рендеринге в представлении.
GitHub:
flash-dance
Ответ 5
В Rails 4.1 это не сработает. У меня другая реализация, поэтому я думаю, что ваш код должен быть изменен следующим образом:
def render_flash
rendered = []
flash.keys do |type|
flash[type].each do |m|
rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank?
end
end
rendered.join('<br/>')
end
Ответ 6
Метод использования как "традиционных" однострочных сообщений, так и типа массива для сообщений с разрывами строк.
С Rails 4.1 и JSON-сериализатором вы можете использовать однострочные флэш-сообщения
flash[:notice] = 'message'
и многострочные флэш-сообщения
flash [: notice] = ['строка сообщения 1', 'строка сообщения 2']
так (в application.html.haml
или соответствующем файле шаблона)
- if notice
#css_class
= safe_join(Array(notice), '<br/>'.html_safe)
Ответ 7
Если вы хотите добавить флэш-сообщения в приложение, вам просто нужно выполнить эти шаги.
Добавьте файл _flash_messages.html.erb и добавьте в него этот код.
<% flash.each do |type, message| %>
<div class="alert <%= bootstrap_class_for(type) %> fade in">
<button class="close" data-dismiss="alert">×</button>
<%= message %>
</div>
<% end %>
И теперь вызовите его в application.html.erb, как добавить эту строку в application.html.erb
<%= render partial: "shared/flash_messages", flash: flash %>
теперь добавьте этот код в application.helper.rb
module ApplicationHelper
def bootstrap_class_for flash_type
case flash_type
when :success
"alert-success"
when :error
"alert-error"
when :alert
"alert-block"
when :notice
"alert-info"
else
flash_type.to_s
end
end
конец
Это сработает для вас, надеюсь.
Ответ 8
Bootstap 4, тонкий
.container.mt-3.full-max-width-down-md
- flash.each do |key, value|
div{class="alert alert-#{key} alert-dismissible fade show text-center" role="alert"}
button type="button" class="close" data-dismiss="alert" aria-label="Close"
i class="fa fa-times" aria-hidden="true"
- if value.is_a? Array
= safe_join(value, "<br />".html_safe)
- else
= value
пример
flash[:notice] = "Hey"
flash[:notice] = ["Hey", "Hey"]
redirect_to my_path, flash: { notice: "Hey" }
redirect_to my_path, flash: { notice: ["Hey", "Hey"] }