如何呈现多条Flash消息?

时间:2014-08-13 12:38:59

标签: ruby-on-rails ruby

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

中有以下方法
  def flash_message
    flash.each do |key, msg|
      return render "admin/shared/#{key}", msg: msg 
    end
  end

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

编辑:

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

- unless flash.empty?
   = flash_message

2 个答案:

答案 0 :(得分:1)

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

我认为最好在视图中执行此操作

使用View:

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

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

答案 1 :(得分: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中只有一条消息。也许你已经覆盖了第一个,而设置了后者?