Rails:一次添加多个flash [:notice]的简便方法

时间:2010-03-15 16:37:28

标签: ruby-on-rails

我认为每次你做一个flash[:notice]="Message"它会将它添加到数组中,然后在视图中显示,但以下只保留最后一个闪存:

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

现在我意识到它只是一个带键的简单哈希(我认为:))但是有更好的方法来执行多次闪烁:

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

9 个答案:

答案 0 :(得分:56)

我通常会将这些方法添加到我的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 %>

答案 1 :(得分:43)

flash消息可以是您想要的任何内容,因此您可以执行以下操作:

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

然后在您的视图中,将其输出为

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

或者你喜欢什么。

该技术是否比其他解决方案更容易取决于您自己的偏好。

答案 2 :(得分:4)

我认为框架中内置的想法是,您粘贴到Flash中的每条消息都是可写的。您为每条消息提供一个唯一的密钥,以便您可以更改或覆盖它。

如果您需要其他信息,请不要将其称为“:通知”。称每件事都是独特的。然后渲染flash消息,循环遍历散列中的任何内容。

如果这对您不起作用,请考虑您是否确实需要简化用户界面。

答案 3 :(得分:2)

虽然我同意Jonathan的说法,UI可能需要一些简化,但有些情况下您可能希望为同一个密钥显示多条消息。

因此,我创建了一个gem(应该)可以轻松处理同一个键中的多个flash消息以及它们在视图中的呈现。

GitHub的: flash-dance

答案 4 :(得分:1)

On 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

答案 5 :(得分:0)

如何使用“传统”单行消息和数组样式来处理带换行符的消息的方法。

使用Rails 4.1和JSON序列化程序,您可以使用单线程闪存消息

flash[:notice] = 'message'

和多行flash消息

flash [:notice] = ['消息行1','消息行2']

像这样(在application.html.haml或相应的模板文件中)

- if notice
   #css_class 
   = safe_join(Array(notice), '<br/>'.html_safe)

答案 6 :(得分:0)

如果要在应用程序中添加Flash消息,只需要执行这些步骤。

添加_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

这对你有用。

答案 7 :(得分:0)

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"] }

答案 8 :(得分:0)

使用this answer作为灵感,轻松地一次完成多条速写消息而无需过多的固定操作:

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

flash[:notice] = flash[:notice].to_s + 'Message 1<br />'
flash[:notice] = flash[:notice].to_s + 'Message 2'

引用上述答案:

之所以可行,是因为NilClass定义了一个返回零长度字符串的#to_s方法,并且实例变量自动被初始化为nil。

根据情况而定,尽管不在此已发布问题的上下文中,但您可能必须处理结尾的中断标记或逗号或所用的任何“定界符”。您可以通过多种方式处理chomp