Rails 4 - 闪存提醒

25

我仍在开发我的Rails 4演示网站,并且碰到一个奇怪的问题。在控制器中有一行代码:

format.html { redirect_to @widget, notice: 'Widget was successfully created.' }

这会在重定向页面中呈现一个闪现消息,这是预期的。然而,消息div附加的CSS类是alert alert-notice,而不是类似于alert-info这样的有效Bootstrap警报类。

该flash的类设置在哪里?我该如何自定义它?

此外,如果我通过ajax删除记录,是否有一种方法可以访问核心flash容器以通过js显示消息,还是必须为ajax请求单独显示/隐藏我的自己的flash消息div?

编辑:受Michael Hartl启发的layouts/application.html.erb

<div class="container">
  <% flash.each do |key, value| %>
    <div class="alert alert-<%= key %>"><%= value %></div>
  <% end %>
  <%= yield %>
</div>

谢谢!

编辑2:

也许我的最初问题没有表述清楚。在这种情况下,我确切地了解了如何在flash对象中设置类。我想学习如何使用和自定义format.html块中的notice:。似乎应该有一种方法通过这个通知传递一个类?或者这不是Rails的核心做法?


这取决于你的观点。查看你的 views/layouts/application.html.* 文件,看看它在哪里呈现了 flash 内容。 - Alex Wayne
1
但是警告alert-notice是有效的Bootstrap类。在重定向操作之前,您可以随时闪烁[:yourchoiceofalert]。 - Ruby Racer
你可能需要从你的资源中移除scaffold.css,因为它会破坏一些bootstrap类。 - Ruby Racer
@StavrosSouvatzis-- http://getbootstrap.com/components/#alerts -- 我没有看到alert-notice是一个有效的类。我错过了什么吗?另外,在我的资产中没有scaffold.css。谢谢! - user101289
对不起,我想指出的是,你需要在"class"前加上"alert alert-",而不是使用"notice"。非常抱歉可能让你产生了误解,我该这么做吗? - Ruby Racer
3个回答

40
application.html.erb 中,您将显示 flash 消息。
请按照以下方式更新该代码。
  <% flash.each do |name, msg| %>
    <%= content_tag :div, msg, class: "alert alert-info" %>
  <% end %>
您可以在class选项中添加要应用于Flash消息的类。 编辑 由于您代码中的alert alert-%= key%>,所以类设置为alert alert-notice。 当您调用redirect_to @widget, notice: 'Widget was successfully created.时,将添加一个Flash消息,其键为notice,值为Widget was successfully created.
flash[:notice] = "Widget was successfully created."

编辑 #2

format.html { redirect_to @widget, notice: '小部件已成功创建。' }

notice: '小部件已成功创建。' 是传递给 redirect_to 方法的一个参数。它被添加到这个方法中的 flash 哈希表中。


1
谢谢,我明白这就是为什么应用了该类。我想知道的是notice:format块中是如何工作的,以及它是如何被访问并转换为flash而不是传递一个flash对象。 - user101289
抱歉,我只是指 format.html 块 - notice: 元素如何被解释以及在哪里?如何为 flash 设置自定义类? - user101289
@user101289请查看“EDIT#2”部分以获取“注意:元素被解释”的问题。 - Kirti Thorat
如果您有更多问题,应该将它们作为新问题发布。请将评论留给当前问题的讨论,例如“这个flash设置在哪个类中,我该如何自定义它?” - Kirti Thorat

31

将此添加到

app/controllers/application_controller.rb

class ApplicationController
  add_flash_types :success, :warning, :danger, :info
end

然后你可以在你的控制器中这样做

format.html { redirect_to @widget, success: 'Widget was successfully created.' }

假设你在你的布局中这样做了

<div class="container">
  <% flash.each do |key, value| %>
    <div class="alert alert-<%= key %>"><%= value %></div>
  <% end %>
  <%= yield %>
</div>

这里是add_flash_types的文档链接:https://api.rubyonrails.org/classes/ActionController/Flash/ClassMethods.html - saudes

1
如果您不想像@Sachin Mour所示那样搞乱您的,您可以相应地添加几个附加CSS类:

在中:

/*flash*/
.alert-error {
    background-color: #f2dede;
    border-color: #eed3d7;
    color: #b94a48;
    text-align: left;
 }

.alert-alert {
    background-color: #f2dede;
    border-color: #eed3d7;
    color: #b94a48;
    text-align: left;
 }

.alert-success {
    background-color: #dff0d8;
    border-color: #d6e9c6;
    color: #468847;
    text-align: left;
 }

.alert-notice {
    background-color: #dff0d8;
    border-color: #d6e9c6;
    color: #468847;
    text-align: left;
 }

逐步教程,如何使用devise和bootstrap处理flash消息,您可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接