Mateusz Urbański
Mateusz Urbański

Reputation: 7862

How can I render more than one flash message?

In my application I want to generate sometimes more than one flash message. I have the following method in my application_helper.rb

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

But when I initialize a few flash messages in my controller, it shows only the first. Any ideas?

Edit:

And in my layout I do something like that

- unless flash.empty?
   = flash_message

Upvotes: 0

Views: 132

Answers (2)

Raghuveer
Raghuveer

Reputation: 2638

As per your code it will return only fist one of the list..

I think its better to do this in view

using View:

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

Or else you can store all the flash messages in another array.. and do your logic at controller level, but this is unnecessary memory cost.

Upvotes: 1

branch14
branch14

Reputation: 1262

Your function will return on the first call to return.

I guess you're aiming for something like...

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

But if I'm not mistaken you will also need to pass the arguments to render differently. Try:

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

A combined version, with a functional twist using map and join will look like this:

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

EDIT:

Here is an example. If your flash looks like this:

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

This code

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

will give you this

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

If this only renders one flash message, I assume there is only one message in flash. Maybe you've overwritten the first, while setting the latter?

Upvotes: 1

Related Questions