2011-07-15 5 views
4

Je pense à mettre en œuvre quelque chose comme ce qui suit et voudrais savoir a) si c'est peut-être une très mauvaise idée pour une raison que je n'ai pas pensée, et b) si non - Y at-il une gemme existante là-bas pour le faire. Fondamentalement, j'aimerais pouvoir mettre en file d'attente des événements javascript à partir de mes contrôleurs de rails afin que, lors du rendu suivant, tous les événements mis en file d'attente soient déclenchés et supprimés de la file d'attente. Un peu comme le mécanisme du flash, mais pour les événements à la place. Ainsi, par exemple .:Rails - déclencher les événements javascript des contrôleurs

dans mon contrôleur:

def create 
    if resource.create 
    add_event('resourceCreated', :id => resource.id) 
    end 
end 

et dans ma mise en page demande quelque chose comme:

%javascript 
    - @events.each do |e| 
    $(document).trigger(#{e.event_name}, #{e.event_data}) 

Toute pensée?

Editer: Ceci serait utile, par ex. Lorsqu'un élément est créé, le serveur peut rediriger vers le formulaire d'édition pour ledit élément, ou peut rediriger vers l'action d'index pour le contrôleur concerné. Ces pages ne savent pas qu'un élément a été créé. Cependant peut-être je veux faire quelque chose comme fermer une fenêtre de dialogue si l'article a été créé avec succès mais le laisser ouvert si ce n'était pas, ou n'importe quel nombre d'autres raisons possibles que je pourrais devoir savoir à ce sujet. Il est évident que non seulement pertinent pour crée, c'est juste l'exemple que je utilise pour illustrer le problème

Edit: Bounty va à celui qui me persuade convaincante d'une façon ou l'autre que ce soit une bonne idée/mauvaise ou fournit un meilleure alternative

+0

Y aura-t-il d'autres types d'événements en plus de la ressource create/update/delete? Si non, pourquoi les messages flash standard ne correspondent pas? – RocketR

Répondre

4

Je vois ce que vous essayez de faire, mais vous devez faire attention à garder les choses séparées.

Ce que je ferais dans cette situation est de créer un hachage, puis #to_json à votre avis. Disons au fond de votre action

contrôleur

@events = [ 
    { :type => "item_created", :message => "Woohoo! Item was created"} 
] 

index.html.erb

<div>Your usual stuff goes here</div> 
<script type="text/javascript" charset="utf-8"> 
    var events = <%= raw @events.to_json %> // You must make sure it's properly sanitised 
</script> 

jQuery

$.ready(function() { 
    events.each(function() { 
     // ... Do what you need to with this 
    }); 
}); 
0

Voici ce que vous pouvez faire ...

Envoyer l'utilisateur à une page, avec un hashtag givven

= link_to "Get aWesome!", awesomem_page_path + '#initiate_awesome' 

qui mappe:Dans cette page, une fois le document chargé, placez une ligne na pour vérifier le hashtag de la page et exécutez un js evven en fonction de ce hashtag. Exemple ici montré pour Jquery avec Haml et en utilisant des événements Jquery:

%h1 aWesomeness is about to happen... 

- content_for :jquery do 
    :javascript 
    $(document).ready(function(){ 
     if (document.location.hash === "#initiate_awesome"){ 
     $('#amazing_div').trigger('awesome_event'); 
     } else { 
      $('#not_so_cool_div').trigger('ultimate_letdown'); 
     } 
    }); 

Avec cette configuration, une fois que la page se charge, il va déclencher votre événement js et faire ce que vous voulez. aWesomeness acquis. Pour les points bonus, puisque ce code js se trouve dans votre modèle, vous pouvez rendre les noms des événements dans l'extrait js de ruby ​​par le controlleer, et faire en sorte que la chaîne d'événements soit écrite en js pour analyse ultérieure.

+0

Cela semble être une alternative viable, mais considérablement plus verbeuse. Pourriez-vous nous dire pourquoi ce serait préférable à ma solution proposée? Merci! – jcoffey

+0

Vous devez juger en fonction de votre situation .. ce n'est pas nécessairement plus préférable .... ils sont très similaires en fait .. La principale différence est que le mien utilise des hashtags et est complètement côté client. Indépendant du backend que vous utilisez. Le vôtre dépend principalement du contrôleur. Je ne vois pas beaucoup plus au-delà de ça ... après cela, c'est votre appel – noli

+0

Gardez à l'esprit, vous n'avez pas besoin de la plupart des grillades que je mets dedans .. c'est juste pour la complétude – noli

2

Je suggère de le faire avec le mécanisme de message flash de Rails, qui est déjà là pour informer précisément l'utilisateur des événements côté serveur qui se sont produits depuis la dernière requête. Collez un fragment de description caché par machine caché à la fin de chaque message flash, écrivez une API Ruby qui facilite l'ajout de tels morceaux, puis quelque chose dans votre vue (ou peut-être écrit dans JS) pour les récupérer et les traiter si nécessaire . En prime, vous pouvez également informer directement l'utilisateur des événements côté serveur dans le même mouvement, même si JS n'est pas activé ou disponible dans leur navigateur.

0

Bonjour, vous pouvez déclencher des événements js à partir de votre contrôleur de la manière suivante.

def create 
    if resource.create 
    add_event('resourceCreated', :id => resource.id) 
    end 
    render :update do |page| 
     page << "dismiss()" 
    end 
end 
Questions connexes