Mário Marroquim

Mais um blog sobre Ruby, Rails, HTML5, CSS3, Jquery...

Rails: Exibindo Mensagens Flash

Exibir flashes de mensagens nas telas: sempre fiz isso de maneiras diferentes nos meus projetos Rails. Acho que nunca fui atrás de uma maneira unificada e elegante.

Nos últimos projetos com Rails 3, que em breve postarei aqui numa página específica, estive utilizando uma partial que resolveu tudo e deixou as webapps mais elegantes.

Ela se integra bem com o Twitter Bootstrap e Inherited Resources, além de ser genérica o suficiente para exibir erros dentro de qualquer @object. Ela pode ser usada também para exibir outras informações como alertas ou mensagens de sucesso :–)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<% object = (@object || resource || @resource) rescue nil -%>

<% if object.present? && object.errors.any? -%>
  <div class="alert alert-error fade in bold no-print">
    <button class="close" data-dismiss="alert">&#215;</button>
    <strong><%= t("activerecord.errors.template.body") -%></strong>
    <br/>
    <ul>
      <% object.errors.full_messages.each do |message| -%>
        <li><%= message -%></li>
      <% end -%>
    </ul>
  </div>
<% else -%>
  <% flash.each do |type, message| -%>
    <% next if ![:notice, :success, :alert, :error, :info].include? type -%>

    <div class="alert <%= bootstrap_class_for(type) -%> fade in bold no-print">
      <button class="close" data-dismiss="alert">&#215;</button>
      <%= message -%>
    </div>
  <% end -%>
<% end -%>

Tive que fazer essa checagem na linha 16 por que o Inherited Resources estava usando a funcionalidade de flash para transmitir outras informações. Aqui nos interessam apenas as mensagens ao usuário!

Bônus: o método helper bootstrap_class_for atribui a classe apropriada do Twitter Bootstrap à div da mensagem e considera até o :notice, que não era muito comum, mas agora é muito usado para enviar mensagens de sucesso ao usuário.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def bootstrap_class_for(flash_type)
  case flash_type
    when :success
      "alert-success"
    when :info
      "alert-info"
    when :error
      "alert-error"
    when :alert
      "alert-warning"
    when :notice
      "alert-success"
  else
    flash_type.to_s
  end
end