Rails 3 / controller / flash hash
-
28-10-2019 - |
Domanda
Voglio essere in grado di passare più messaggi all'hash flash, all'interno del mio controller, e farli visualizzare bene insieme, ad esempio, in una lista proiettata. Il modo in cui ho ideato per farlo è quello di creare una funzione di supporto nel mio controller dell'applicazione, che forma un array in un elenco proiettato, che poi passerò, nel mio caso, flash [: successo]. Questo non è chiaramente il modo di Rails perché, IA, la mia lista proiettata viene codificata. Cioè, invece di ottenere:
- Messaggio 1
- Messaggio 2
Ottengo:
u003Cul>u003Cli>Messaggio 1u003C/li>u003Cli> Messaggio 2u003C/li>u003C/ul>
Sono sicuro che potrei trovare un modo per RAW () l'output, ma non c'è un modo semplice per far funzionare qualcosa di simile? Forse c'è un'opzione da passare a Flash []? Qualcos'altro?
Soluzione
ero solito render_to_string
E un parziale anziché un aiutante per ottenere qualcosa di simile.
# app/controller/dogs_controller.rb
def create
@dog = Dog.new(params[:dog])
@messages=[]
if @dog.save
@messages << "one"
@messages << "two"
flash[:notice] = render_to_string( :partial => "bulleted_flash")
redirect_to(dogs_path)
else
render :action => 'new
end
end
Quindi formatto l'array di messaggi flash in un elenco HTML
# app/views/dogs/_bulleted_flash.html.erb
<ol>
<% @messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ol>
Che produce il seguente HTML
# http://0.0.0.0:3000/dogs
<body>
<div id="flash_notice">
<ul>
<li>one</li>
<li>two</li>
</ul>
</div>
...
</body>
Se hai bisogno di continuare a utilizzare un aiutante, penso che tu debba aggiungere il html_safe
Metodo alla stringa per impedirgli di codificare (che Rails 3 fa per impostazione predefinita). Ecco un Domanda che mostra come usare html_safe
in modo simile
Altri suggerimenti
Se stai usando Rails3, prova il metodo grezzo.
raw(my_html_string)
E non sfuggirà all'HTML. Oh, scusa, ho appena letto la tua ultima frase. Dai un'occhiata a queste informazioni, "Problemi di messaggi Flash Rails 3", sembra che potrebbe essere quello che stai cercando:
Di solito chiederei maggiori informazioni sulle tue opinioni e layout in questa situazione, perché le impalcature non vengono visualizzate flash[:success]
Per impostazione predefinita.
Il modo in cui lo risolvo è rifare totalmente i miei messaggi flash di solito, creando il flash[:whatever]
un array ogni volta e nel mio layout che gestisce quell'array invece di solo l'avviso. Ricorda che Flash è solo un hash, stai solo impostando i valori.
Tuttavia, se vuoi solo farlo con la configurazione che hai ora (Helper che mette l'HTML all'interno del flash[:success]
), è possibile modificare il modo in cui i messaggi flash vengono visualizzati nel file di layout. Per impostazione predefinita, sono solo usati <%= flash[:success] %>
, che sfugge automaticamente a HTML. Per farlo non farlo per i messaggi flash, cambiarlo in <%=raw flash[:success] %>