Que abordagem você tomar para a incorporação de links em mensagens de flash?
-
19-09-2019 - |
Pergunta
A capacidade de ter mensagens flash (aviso, de erro, de aviso, etc) com links embutidos é bom do ponto de vista de interação do usuário. No entanto, a incorporação de uma marca de âncora dentro de uma mensagem de flash do controlador está suja.
Vamos supor que uma mensagem flash como este é bom para a usabilidade *:
Exemplo flash Aviso de mensagem com um link incorporado http://img.skitch.com/20090826- xbsa4tb3sjq4fig9nmatakthx3.png (emprestado de DailyMile.com )
O que tática você levaria entre o controlador e vista para empregar algo como isso corretamente?
Solução
Apenas pensei que eu iria compartilhar isso, desde resposta descobri que eu estava procurando em outros lugares:
Obras sobre trilhos 3.1
flash[:notice] = "Proceed to #{view_context.link_to('login page', login_path)}".html_safe
Outras dicas
Glenn Gillen tem uma abordagem que ele chama de mensagens úteis de flash em Rails .
I modificado seus trechos de código a ser um pouco mais idiomática (pelo menos para mim).
O controlador enche o flash como este:
flash[:notice] = "Your profile was updated. %s"
flash[:notice_item] = ["Edit again?", edit_profile_path(@profile)]
Você, então, pode ter ajudantes que algo parecido com isto:
def render_flash_messages(*keys)
messages = keys.collect do |key|
content_tag(:p, flash_message_with_item(key), :class => "flash #{key}") if flash[key]
end.join
content_tag(:div, messages, :id => "flash_messages") unless messages.blank?
end
def flash_message_with_item(key)
item = flash["#{key}_item".to_sym]
substitution = item.is_a?(Array) ? link_to(*item) : item
flash[key] % substitution
end
A visão parece simplesmente assim:
<%= render_flash_messages(:error, :notice, :warning) %>
A visão (através do ajudante flash_message_with_item
) é responsável por criar a marca de âncora, mas o controlador gerencia o que vai para a mensagem flash, incluindo um recurso opcional para novas acções.
Você pode criar um método auxiliar para tornar as parciais com base no valor passado de volta na mensagem flash.
Este é semelhante ao link_to () em trilhos piscar
# In your controller
flash[:error] = render_to_string(:partial => "sessions/login_failed_message")
# In sessions/_login_failed_message.html.erb
Login failed. If you have forgotten your password, you can #{link_to('reset it', reset_path)}