14

我正在尝试在控制器中设置 Flash 通知,但似乎我只能定义:notice。当我尝试定义 :errors 或 flash[:errors] 时,我遇到了一堆错误。我目前正在使用此功能,但所有消息显然都是通知类型,而不是错误或警告。我想知道如何设置错误或警告而不是通知。我正在使用 rails 3.2 和 twitter bootstrap rails gem

在 application.html.erb

<%= bootstrap_flash %>

manuals_controller.rb

class ManualsController < ApplicationController
  def create
    respond_to do |format|
      format.html { redirect_to root_url, notice:'MyManual was successfully created.' }
    end
  end
end
4

1 回答 1

28

您正在使用 seyhunak 的twitter-bootstrap-rails gem 中的 flash 助手。您可以自己设置代码并查看一切是如何工作的,而不是使用帮助程序。

下面是我使用 Twitter Boostrap 设置 Rails 闪存消息的方法。

Rails 使用 :notice 和 :alert 作为 flash 消息键。Twitter Bootstrap 提供了一个基类 .alert 以及附加类 .alert-success 和 .alert-error(请参阅 Bootstrap 警报文档)。需要进行一些解析才能获得使用 Twitter Bootstrap “alert-success” 样式设置样式的 Rails “通知”消息。任何其他消息,包括 Rails 的“警报”消息,都将使用 Twitter Bootstrap 的“警报错误”样式。

默认情况下,Twitter Bootstrap 为 .alert-success 应用绿色背景,为 .alert-error 应用红色背景。Twitter Bootstrap 提供了蓝色背景的第三类 .alert-info。稍加修改,就可以创建一个带有自定义名称的 Rails 闪存消息,例如 :info,它将与 Bootstrap .alert-info 类一起显示。然而,坚持使用“alert”和“notice”的 Rails 惯例是明智的。早期版本的 Rails 使用“错误”,但当前的做法是使用“警报”而不是“错误”。

您可以在应用程序布局文件中包含直接显示 Flash 消息的代码,也可以创建部分代码。这是一个带有部分的示例。

首先,应用程序布局中的内容:

# app/views/layouts/application.html.erb 
.
.
.
<%= render 'layouts/messages' %>
.
.
.

接下来,包含在应用程序布局中的部分:

# app/views/layouts/_messages.html.erb
# Rails flash messages styled for Bootstrap 3.0
# works with Rails 4.0 or Rails 4.1
<% flash.each do |name, msg| %>
  <% if msg.is_a?(String) %>
    <div class="alert alert-<%= name.to_s == 'notice' ? 'success' : 'danger' %>">
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      <%= content_tag :div, msg, :id => "flash_#{name}" %>
    </div>
  <% end %>
<% end %>

以及在控制器中设置两个不同的闪存消息的示例:

class VisitorsController < ApplicationController

  def new
    flash[:notice] = 'Welcome!'
    flash[:alert] = 'My birthday is soon.'
  end

end

这个例子来自我写的一篇深入的文章:

Twitter Bootstrap 和 Rails

有关容纳四种不同闪存消息类型(成功、错误、警报、通知)的替代方案,请参阅使用 Twitter Bootstrap的 Rails 闪存消息示例。

于 2013-07-29T19:04:50.813 回答