我认为每次你做一个flash[:notice]="Message"
它会将它添加到数组中,然后在视图中显示,但以下只保留最后一个闪存:
flash[:notice] = "Message 1"
flash[:notice] = "Message 2"
现在我意识到它只是一个带键的简单哈希(我认为:))但是有更好的方法来执行多次闪烁:
flash[:notice] = "Message 1<br />"
flash[:notice] << "Message 2"
答案 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