Exibindo mensagens no Rails
08/12/06
Sempre tive o costume de diferenciar as mensagens que exibo ao usuário em 4 tipos: info, notice, warning e error. Dessa forma, consigo exibir cada mensagem com formato visual diferente.

No Rails é muito simples fazer isso. Basta colocar o método abaixo no arquivo "application_helper.rb".
module ApplicationHelper
def flash_message
messages = ""
[:notice, :info, :warning, :error].each {|type|
if flash[type]
messages += "<p class=\"#{type}\">#{flash[type]}</p>"
end
}
messages
end
end
No seu controller, você define as mensagens utilizando o flash.
flash[:notice] = "Informações salvas com sucesso."
flash[:warning] = "Preencha todos os campos obrigatórios."
flash[:error] = "Não foi possível salvar as informações."
flash[:info] = "Você tem mensagens não visualizadas."
Na sua view basta você chamar o método da seguinte maneira:
<%= flash_message %>
Uma outra vantagem de utilizar este método é que caso nenhuma mensagem tenha sido definida, ele não exibe um elemento vazio na página.
- Permalink
- Trackback
- Feed dos comentários
- Ao som de: Fall Out Boy – Dance, Dance

Comentários #
Bem bacana essa daqui…
Nesse caso ainda é necessário definir as classes que serão usadas pela tag , por exemplo, uma classe para notice, outra para warning e assim sucessivamente?
Muito bacana isso! Valeu pela dica.
Yuri, você que precisa formatar a mensagem. Este método apenas cria o HTML.
Muito bom, parabens, o mais interessante é ver nós brazucas metendo bronca no rails… e com certeza nossa fama de ótimos criadores está no mundo todo….
Eu tinha feito um lance parecido.
Mas não era um código tão limpo! Boa Nando!
Abraço!
Compartilha com a gente o seu css tb. :)
Ah, qual sistema de blog vc tá usando aqui? É algum em Rails? Tô tentando me virarcom o Mephisto… muito bom!
Fala Arthur! Não é nada de mais! É algo assim:
.notice, .error, .warning, .info {
font-weight: bold;
margin: -10px 0 15px 0;
padding: 5px 5px 5px 27px;
}
.notice {
border: 1px solid #9c9;
background: #e2f9e3 url(../images/tick.png) no-repeat 5px center;
color: #060;
}
.error {
border: 1px solid #c68484;
background: #fcc url(../images/cross.png) no-repeat 5px center;
color: #c00;
}
.warning {
border: 1px solid #dd0;
background: #ffc url(../images/error.png) no-repeat 5px center;
color: #000;
}
.info {
border: 1px solid #82c2d4;
background: #ebf5f8 url(../images/information.png) no-repeat 5px center;
color: #000;
}
As imagens são do http://famfamfam.com
A dica é legal, mas o que eu mais gostei do post foi o layout das mensagens! Já incorporei aos meus sistemas (com algumas modificações). :)
Parabéns, NANDOVIEIRA: ótima dica.
Uma simples idéia simples - eficiente e elegante.
Novamente, parabéns.
Ah, só complementando (uma vez que usei no meu projeto as idéias que o NANDOVIEIRA publicou aqui):
Para manter o texto das mensagens sempre em HTML, pode-se alterar a linha:
messages += "#{flash[type]}"
por:
messages += "" + html_escape(flash[type]) +""
e, assim, as mensagens saem todas em plain-HMLT (e isso ajuda bastante em idiomas como o nosso, com acentos e demais caracteres especiais.
É isso. A idéia continua simples e bacana.
Fala Nando, essa personalização das mensagens é uma ótima idéia. No caso do spesa você dispara um effect para mostrar as mensagens. Essa chamada aos effects é feita a partir de onde?
Estou querendo usar as mesmas cores e icones no meu projeto, tem problema?
Olá André. O efeito é chamado no arquivo Javascript. Existe uma função genérica que faz isso automaticamente. Você pode usar o ícones sim. Abraço!
aqui ta dando o erro
Status: 500 Internal Server Error Content-Type: text/html
We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.
Dá uma olhada no log que lá irá dizer o que está dando de errado. Se quiser, posta no pastebin.com (lembre-se de marcar a opção "forever") e colocar um link que tento ajudar! ;)
Nando, realmente está dando um erro 500 como ocarlos falou acima,
dá uma olhada no erro!
http://pastebin.com/f3471029e
Weldys, o WP estava convertendo dois apóstrofos para uma aspa! Estúpido. O código foi corrigido!
rsrs.. eu tinha acabado de decifrar o problema… eu tinha mudado pq tinha achado estranho só a abertura das aspas, mas tudo bem. tah tudo certo! Agora o código tá redondim!
Valeu e parabéns pela dica :)
Nando,
Parabéns, muito útil e simples.
Já estou usando em minha aplicação.
Eu estava tentando fazer a exibição deste flash_message responder a uma chamada RJS. Tenho uma função que posta comentários e ela adiciona os posts por ajax, ou seja, a página não é renderizada novamente e portanto o flash_message não é acionado, ficando sem mensagem.
Neste método que posta comentários eu tenho:
render :update do |page|
…
# No caso de ser uma mensagem no formato notice eu faço o seguinte
page['feedback'].replace("#{@comentario.comentario}")
page['feedback'].show
end
Na view eu tenho:
…
…
Na primeira vez que eu posto um comentário, funciona corretamente, mas seu eu tentar postar outro comentário logo em seguida dá o seguinte erro:
RJS error:
TypeError: $("feedback") is null
Opa,
corrigindo o último post que ficou sem a parte da view:
Na view eu tenho um div com id "feedback" e dentro dele o a chamada rails para "flash_message"
Obrigado por qualquer dica.
Eduardo M.
Sobre os dois últimos posts, consegui!
Se alguém estiver querendo usar o flash_message com RJS faça da seguinte forma:
No application_helper eu fiz o método:
# Mostra a mensagem informativa utilizada em operações realizadas com sucesso.
# O elemento (div, td…) da página que contém o método "flash_message" deve ter id='feedback'
# @page Página usada no "render update do |page|"
# @tipo notice, warning, info, error
# @mensagem String que será a mensagem renderizada
def flash_message_now (page,tipo,mensagem)
page.replace_html 'feedback', "#{mensagem}"
page.show 'feedback'
end
No controller eu tenho, por exemplo:
render :update do |page|
…
flash_message_now(page,"notice","Comentário enviado com sucesso")
end
Eduardo Mucelli.
Desculpe mais um post, mas no post anterior eu esqueci do html, que foi comido pelo na postagem.
Na linha "page.replace_html 'feedback', "#{mensagem}"" deveria ser:
page.replace_html 'feedback', "menor p class='#{tipo}' maior #{mensagem} menor barra p maior"
Eduardo Mucelli.
Nando, estou tentando utilizar aquele efeito que faz as mensagens aparecem e desaparecem automaticamente mas não estou conseguindo. Pode me dar uma dica ou postar algo sobre a utilização desse efeito ?
Muito obrigado e desculpe qualquer coisa ;)
Abraços.
Deixe um comentário