Подтвердить что ты не робот

Rails: простой способ добавить несколько вспышек [: уведомление] за раз

Я думал, что каждый раз, когда вы делаете flash[:notice]="Message", он добавляет его в массив, который затем будет отображаться во время просмотра, но следующее просто сохраняет последнюю вспышку:

flash[:notice] = "Message 1"
flash[:notice] = "Message 2"

Теперь я понимаю, что это простой хэш с ключом (я думаю:)), но есть лучший способ сделать несколько вспышек, чем следующее:

flash[:notice] = "Message 1<br />"
flash[:notice] << "Message 2"
4b9b3361

Ответ 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"] }