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?

Foi útil?

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)}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top