【问题标题】:How can I render more than one flash message?如何渲染多条 Flash 消息?
【发布时间】:2014-08-13 12:38:59
【问题描述】:

在我的应用程序中,有时我想生成不止一条 Flash 消息。我的 application_helper.rb 中有以下方法

  def flash_message
    flash.each do |key, msg|
      return render "admin/shared/#{key}", msg: msg 
    end
  end

但是当我在控制器中初始化一些闪存消息时,它只显示第一个。有什么想法吗?

编辑:

在我的布局中,我会做类似的事情

- unless flash.empty?
   = flash_message

【问题讨论】:

  • 你不应该那样做......如果你再次调用相同的方法,不会有任何改变吧?
  • 仅在视图中直接渲染 flash 消息.. 不能通过其他方法
  • 您是如何将消息添加到 Flash 中的?

标签: ruby-on-rails ruby


【解决方案1】:

您的函数将在第一次调用 return 时返回。

我猜你的目标是……

  def flash_message
    result = ''
    flash.each do |key, msg|
      result += render("admin/shared/#{key}", msg: msg) 
    end
    result
  end

但如果我没记错的话,您还需要以不同的方式将参数传递给render。试试:

render(partial: "admin/shared/#{key}", locals: { msg: msg })

使用mapjoin 的组合版本将如下所示:

  def flash_message
    flash.map do |key, msg|
      render(partial: "admin/shared/#{key}", locals: { msg: msg })
    end.join('')
  end

编辑:

这是一个例子。如果你的flash 看起来像这样:

flash = {notice: 'Everything find.', error: 'Ups, my bad: Error'}

这段代码

flash.map { |key, str| "<div class='#{key}'>#{str}</div>" }.join('')

会给你这个

"<div class='notice'>Everything find.</div><div class='error'>Ups, my bad: Error</div>"

如果这只呈现一条 flash 消息,我假设 flash 中只有一条消息。也许您在设置后者的同时覆盖了第一个?

【讨论】:

  • 感谢您的帮助,但是当我使用此代码时,它仍然只渲染第一次闪光。
  • @MateuszUrbański:我更新了我的答案。请检查您在flash 中是否有超过一条消息。
  • 它仍然无法正常工作。我不知道为什么会这样,但感谢您提供帮助。
【解决方案2】:

根据您的代码,它只会返回列表中的第一个..

我认为这样做更好

使用视图:

- Ruby Code in View 
%ul#error-msg-list
  flash.each do |key, msg|
    %li.error-message= "<!-- your html --> admin/shared/#{key}" 
  end

否则您可以将所有闪存消息存储在另一个数组中......并在控制器级别执行您的逻辑,但这是不必要的内存成本。

【讨论】:

  • 感谢您的帮助,但是当我以这种方式执行此操作时,它仍然只显示一个闪光...我不知道发生了什么。
  • 你的表现如何?你能更新你的问题吗?
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多