2014-10-23 9 views
11

Nel mio controller ho il seguente codice:Messaggio flash con html_safe dal controller in Rails 4 (versione di sicurezza)

format.html { redirect_to new_customer_url, 
       notice: %Q[ A customer already exists with with this shopping id. Edit this customer #{view_context.link_to("here", edit_customer_url(@duplicate))}. 
    ].html_safe 

mi piacerebbe essere in grado di includere un link in un messaggio flash, in modo (come puoi vedere) chiamo html_safe per rimuovere la stringa. Tuttavia, sembra che da Rails 4.1 questo sia ora gestito in modo diverso. (Vedi here e here)

Una soluzione a questo è stata fornita in this question. Tuttavia, lo fa solo spostando la chiamata html_safe alla vista, con l'effetto di non eseguire il escape di tutti i messaggi flash.

Preferirei essere un po 'più paranoico di così, c'è un modo per includere il collegamento nel messaggio flash dal controller?

risposta

15

Ecco un possibile modo per risolvere questo problema. Aggiungi un filtro precedente al tuo ApplicationController che renderà sicuro flash[:notice] html solo se è impostato flash[:html_safe]. Quindi puoi controllare quando e quando non fare notifiche html completamente al sicuro dal controller.

before_filter -> { flash.now[:notice] = flash[:notice].html_safe if flash[:html_safe] && flash[:notice] } 

Allora il tuo esempio potrebbe essere modificato per questo:

format.html do 
    redirect_to(
    new_customer_url, 
    notice: %Q[ A customer already exists with with this shopping id. Edit this customer #{view_context.link_to("here", edit_customer_url(@duplicate))}.], 
    flash: { html_safe: true } 
) 
end 
+2

funziona come un fascino! Grazie. =) – 0112

+0

a partire da Rails 4.2 questo non funziona nel controller provato flash [: avviso] = "stringa di soem
altro testo" .html_safe – user1136228

+0

@ user1136228 Ho appena provato questo con Rails 4.2.1 e 4.2.5 e sicuramente lavorato. Si prega di controllare il codice. –

Problemi correlati