2009-03-02 7 views
8

La plupart de mes fichiers js.erb contient quelque chose comme ça au fond:tarir les fichiers js.erb (inclure un autre fichier js.erb)

$("#flash_message").html("<%= escape_javascript(content_tag(:p, flash[:note], :class => "note")) %>"); 
$("#flash_message").fadeOut(2000); 
$("#loading").remove(); 

Je voudrais déplacer ces lignes dans un fichier séparé puis appelez ce fichier à partir de chacun de mes fichiers js.erb. Est-ce que quelque chose comme ça est possible?

Cordialement. Asbørn Morell

Répondre

7

Oui, vous pouvez créer une app/views/shared/_flash_messages.js.rjs partielle, que vous pouvez rendre partout (par exemple, d'autres rjs partials.)

Mon approche dans ce genre d'applications a été la suivante:

  • pour les réponses non-AJAX qui peuvent avoir un flash:

    • dans la disposition (par ex. layouts/application.erb), ajouter par exemple:
      render :partial => 'shared/flash_messages.html.erb'
  • pour les réponses AJAX qui peuvent aussi avoir besoin d'afficher un message flash, j'ai ajouté le code rjs suivant:

    • dans chaque réponse rjs (par exemple controller/action.js.rjs), ajouter par exemple:
      render :partial => 'shared/flash_messages.js.rjs'

Lorsque les deux partiels effectuent le rendu du flash, appelez le flash.discard(:error) ou le flash.discard(:notice) selon le cas.

Exemple de fichier app/views/shared/flash_messages.html.erb:

<% if flash[:error] %> 
<div id="flash_message" class="error"><%= h(flash[:error]) %></div> 
<% flash.discard(:error) %> 
<% elsif flash[:notice] %> 
<div id="flash_message" class="notice"><%= h(flash[:notice]) %></div> 
<% flash.discard(:notice) %> 
<% else %> 
<div id="flash_message" style="display: none;" /> 
<% end %> 

Sample file app/views/shared/flash_messages.html.rjs:

if !flash[:error].blank? 
    page['flash_message']. 
    replace_html(flash[:error]). 
    removeClassName('notice'). 
    addClassName('error'). 
    show() 
else 
    page['flash_message']. 
    replace_html(flash[:notice]). 
    removeClassName('error'). 
    addClassName('notice'). 
    show() 
end 
+0

Thankyou. C'était exactement le genre d'exemple que j'espérais. Mes fichiers js.erb sont beaucoup plus propres maintenant;) – atmorell

Questions connexes