Rails: простой способ добавить более одной вспышки [: note] одновременно - PullRequest
36 голосов
/ 15 марта 2010

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

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

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

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

Ответы [ 8 ]

56 голосов
/ 16 марта 2010

Я обычно добавляю такие методы в мой 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 %>
43 голосов
/ 15 марта 2010

Сообщение flash действительно может быть чем угодно, поэтому вы можете сделать что-то вроде этого:

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

А затем в ваших представлениях выведите его как

<%= flash[:notice].join("<br>") %>

Или как хотите.

Является ли этот метод проще , чем другие решения, определяется вашими собственными предпочтениями.

4 голосов
/ 03 августа 2011

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

Если вам нужно другое сообщение, не называйте его ": уведомление". Назовите каждого чем-то уникальным. Затем для рендеринга флеш-сообщений переберите все, что есть в хэше.

Если это не работает для вас, подумайте, действительно ли вам нужно упростить ваш интерфейс.

2 голосов
/ 03 декабря 2012

Хотя я согласен с Джонатаном в том, что пользовательский интерфейс может нуждаться в некотором упрощении, в некоторых случаях вам может потребоваться отобразить несколько сообщений для одного и того же ключа.

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

GitHub: флэш-танец

1 голос
/ 15 июля 2014

На 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
0 голосов
/ 28 января 2019

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"] }
0 голосов
/ 09 июня 2016

Если вы хотите добавить флэш-сообщения в ваше приложение, вам просто нужно выполнить эти шаги.

Добавьте файл _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

модуль 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

конец

Надеюсь, это сработает для вас.

0 голосов
/ 01 сентября 2015

Метод использования «традиционных» однострочных сообщений и стиля массива для сообщений с переносами строк.

С Rails 4.1 и сериализатором JSON вы можете использовать однострочные флэш-сообщения

flash[:notice] = 'message'

и многострочные флеш-сообщения

мигает [: извещение] = ['строка сообщения 1', 'строка сообщения 2']

вот так (в application.html.haml или в соответствующем файле шаблона)

- if notice
   #css_class 
   = safe_join(Array(notice), '<br/>'.html_safe)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...