47 votes

Rails: un moyen facile d'ajouter plus d'un flash [: notice] à la fois

Je pensais que chaque fois que vous effectuez un flash[:notice]="Message" il l'ajouterait au tableau qui serait ensuite affiché pendant la vue, mais ce qui suit ne fait que garder le dernier flash:

 flash[:notice] = "Message 1"
flash[:notice] = "Message 2"
 

Maintenant, je me rends compte que c'est juste un hachage simple avec une clé (je pense :)) mais y a-t-il une meilleure façon de faire plusieurs flashs que ce qui suit:

 flash[:notice] = "Message 1<br />"
flash[:notice] << "Message 2"
 

Merci.

Josh

63voto

Victor Savkin Points 654

J'ajoute généralement de telles méthodes à mon ApplicationHelper:

 def flash_message(type, text)
    flash[type] ||= []
    flash[type] << text
end
 

Et

 def render_flash
  rendered = []
  flash.each do |type, messages|
    messages.each do |m|
      rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank?
    end
  end
  rendered.join('<br/>')
end
 

Et après il est très facile de les utiliser:

Vous pouvez écrire quelque chose comme:

 flash_message :notice, 'text1'
flash_message :notice, 'text2'
flash_message :error, 'text3'
 

dans votre contrôleur.

Et ajoutez simplement cette ligne à votre mise en page:

 <%= render_flash %>
 

51voto

mipadi Points 135410

Le message flash peut vraiment être ce que vous voulez, vous pouvez donc faire quelque chose comme ceci:

 flash[:notice] = ["Message 1"]
flash[:notice] << "Message 2"
 

Et puis dans vos vues, sortez-le comme

 <%= flash[:notice].join("<br>") %>
 

Ou tout ce que vous préférez.

Que cette technique soit plus facile que d'autres solutions est déterminé par vos propres préférences.

5voto

Je pense que l'idée intégrée dans le cadre est que chaque message que vous collez en flash est réinscriptible. Vous donnez à chaque message une clé unique afin que vous puissiez le modifier ou l'écraser.

Si vous avez besoin d'un autre message, ne l'appelez pas ": remarquez". Appelez chacun quelque chose d'unique. Ensuite, pour afficher les messages flash, parcourez tout ce qui se trouve dans le hachage.

Si cela ne fonctionne pas pour vous, demandez-vous si vous devez réellement simplifier votre interface utilisateur.

2voto

MunkiPhD Points 2610

Bien que je convienne avec Jonathan que l'interface utilisateur peut nécessiter une simplification, il existe des cas où vous souhaiterez peut-être afficher plusieurs messages pour la même clé.

En conséquence, j'ai créé un joyau qui (devrait) faciliter le traitement de plusieurs messages flash dans la même clé et leur rendu dans la vue.

GitHub: flash-dance

1voto

sekrett Points 121

Sur Rails 4.1, cela ne fonctionnera pas. J'ai une implémentation différente, donc je pense que votre code devrait être modifié de cette façon:

 def render_flash
  rendered = []
  flash.keys do |type|
    flash[name].each do |m|
      rendered << render(:partial => 'partials/flash', :locals => {:type => type, :message => m}) unless m.blank?
    end
  end
  rendered.join('<br/>')
end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X