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

Jos*_*ter 36 ruby-on-rails

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

flash[:notice] = "Message 1"
flash[:notice] = "Message 2"
Run Code Online (Sandbox Code Playgroud)

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

flash[:notice] = "Message 1<br />"
flash[:notice] << "Message 2"
Run Code Online (Sandbox Code Playgroud)

Vic*_*kin 55

我通常会将这些方法添加到我的ApplicationHelper中:

def flash_message(type, text)
    flash[type] ||= []
    flash[type] << text
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

之后很容易使用它们:

你可以这样写:

flash_message :notice, 'text1'
flash_message :notice, 'text2'
flash_message :error, 'text3'
Run Code Online (Sandbox Code Playgroud)

在你的控制器中.

只需将此行添加到您的布局:

<%= render_flash %>
Run Code Online (Sandbox Code Playgroud)

  • 一个很好的答案.但是,存在两个问题:`flash.now`方法以及在`redirect_to`调用中将flash消息作为额外参数的可能性.第一个可以通过给`flash_message`方法提供第三个(可能是可选的)布尔参数来处理; 如果给出`true`作为其值,则该方法应该使用`flash.now`数组而不是`flash`.(对空数组的一次初始化就足够了.)第二个问题只需要在调用`redirect_to`之前在单独的行上设置flash消息而不是使用extra参数. (3认同)
  • @Victor 我强烈建议将 `messages.each do |m|` 调整为 `Array.wrap(messages).each do |m|`。这使得任何现有的闪存消息都可以向后兼容,这有两个原因。1. 对所有现有闪现消息的重构较少(仅当需要多条消息时才需要替换)。2. 它将确保任何添加 flash 消息的 gem 不会导致异常,例如 [Devise](https://github.com/heartcombo/devise) 或 [Authlogic](https://github.com/binarylogic/ authlogic),它管理用户身份验证并通常添加闪存消息。 (3认同)

mip*_*adi 44

flash消息可以真的是你想要的任何东西,所以你可以做这样的事情:

flash[:notice] = ["Message 1"]
flash[:notice] << "Message 2"
Run Code Online (Sandbox Code Playgroud)

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

<%= flash[:notice].join("<br>") %>
Run Code Online (Sandbox Code Playgroud)

或者你喜欢什么.

这种技术是否比其他解决方案更容易,取决于您自己的偏好.

  • 在Rails 3中,除非标记为安全,否则```将被转义.试试[safe_join](http://apidock.com/rails/ActionView/Helpers/OutputSafetyHelper/safe_join):`<%= safe_join(flash [:notice],"<br>".html_safe)%>`.另请注意,单个闪存项通常只是字符串.mipadi在实例化周围使用[方括号]来创建一个数组.如果没有这些括号,`<<`只会在字符串中附加更多文本. (2认同)

Jon*_*sch 5

我认为框架中内置的想法是,您粘贴到闪存中的每条消息都是可重写的。您为每条消息指定一个唯一键,以便您可以更改或覆盖它。

如果您需要另一条消息,请不要将其称为“:notice”。称每一个都是独一无二的。然后为了呈现 flash 消息,循环遍历哈希中的任何内容。

如果这对您不起作用,请考虑您是否真的需要简化您的 UI。