2010-01-10 3 views
2

Ceci est peut-être une question de débutant, mais je ne suis pas sûr de ce que les termes à rechercher.Comment mettre en cache des objets de modèle ActiveRecord entre des redirections?

Dites que j'ai un objet CLIENT et que je veux envoyer un MESSAGE à ce client.

Ce que je ferais d'abord est d'ajouter une action SENDMESSAGE sur le contrôleur CUSTOMER, qui construit l'objet de message. (Supposons que c'est la bonne chose à faire?)

Dans ce cas, plutôt que d'envoyer réellement le message depuis cette action, je dois passer à la vue d'édition du MESSAGE pour capturer le texte du corps, etc.

La question: Je veux faire ceci sans persister l'objet. Je veux construire l'objet ici et ensuite le remettre à une autre vue pour l'achèvement.

def sendmessage 
    @message = Message.new 
    @message.title = 'WIBBLE' 
    @message.thecustomer = self 
    @message.save  
    respond_to do |format| 
     format.html { redirect_to(edit_message_path(@ message)) } 
     format.xml { render :xml => @ message } 
    end 
end 

Peut-être que ma question se résume à, ce qui est le « rails façon » aux paramètres du cache et des objets à travers les demandes et les multiples écrans.

Heureux d'être pointé vers les URLs Web comme je l'espère c'est simple.

Merci

Répondre

1

La méthode standard pour conserver des données d'demandes lors de la construction des applications Web est d'utiliser la session HTTP. Rails rend un hash de session implicite disponible à cet effet. Il est utilisé comme ceci:

session[:message] = @message #store 
@message = session[:message] #retrieve 

Vous pouvez également utiliser les Rails flash enveloppe de session pour transmettre l'information de l'action en cours à l'autre. Il est généralement utilisé pour le stockage de texte à afficher dans l'interface utilisateur, mais vous pouvez l'utiliser pour tout objet persistant:

flash[:message] = @message #store 
@message = flash[:message] #retrieve 

Dans les deux cas, les objets que vous stockez doit être sérialisable. Notez que par défaut Rails stocke les données de session dans un cookie chiffré sur le client; considérez-le comme un indice fort que le stockage de beaucoup de données dans la session est mal vu dans le monde de Rails.

+0

Un grand merci John.Le contenu de la session dans un cookie ressemble à une décision de conception étrange! –

+0

Puis-je également demander, utiliseriez-vous la session pour mettre en cache les actions du contrôleur. par exemple. mon action INDEX effectue une requête géniale basée sur les paramètres entrants. Je veux mettre en cache cette liste de résultats spécifique pour l'appel ultérieur à SENDMESSAGE. (Cela pourrait potentiellement signifier des milliers d'objets stockés dans le cookie de session donc deviner non.) Cependant, au moment de l'appel SENDMESSAGE, je n'ai pas tous les paramètres nécessaires pour reconstruire la liste CLIENT? Peut-être cache ces paramètres? –

+0

Cela ressemble à la mise en cache des paramètres afin que vous puissiez reconstruire la requête serait le chemin à parcourir.Notez que j'ai dit que le magasin de session cookie est le Rails par défaut. L'option config.action_controller.session_store' dans 'environment.rb' vous permet d'utiliser la base de données pour le stockage de la session à la place –

1

C'est en fait une tâche assez courante que vous compliquez. La méthode Rails pour gérer cela n'est pas de conserver l'objet en question, mais de simplement afficher la vue qui complète l'action.

class CustomersController < Application Controller 
    def sendmessage 
    @message = Message.new 
    @message.title = 'WIBBLE' 
    @message.thecustomer = self 
    respond_to do |format| 
     format.html { render "messages/edit" } 
     format.xml { render :xml => @ message } 
    end 
    end 
end 

En général des objets entiers persistant à travers les requêtes HTTP dans Rails est une mauvaise idée, la seule façon de le faire est de ASSURE A à travers le hachage de session ou flash comme John Topley suggère, mais les deux personnes sont limitées dans la quantité d'espace disponible. C'est pourquoi François Beausoleil propose de ne stocker que l'identifiant de l'objet dans la session. De toute façon, vous devriez effacer l'un ou l'autre hash quand vous en avez fini.

Ce que vous devriez faire ici, est la conception de vos actions de contrôleur de sorte que chaque action complète complètement une tâche. Remplir la moitié d'une tâche et la rediriger pour qu'une deuxième action puisse accomplir la tâche peut être légèrement plus sèche, mais cela ne se gomme pas bien avec le flux de contrôle Rails. Comme le montre l'exemple, l'action du contrôleur termine tout le traitement requis pour afficher la vue. Essentiellement, si vous cherchez à conserver des informations parce que vous redirigez. Vous trouverez plus facile de rendre la vue à laquelle vous redirigez.

+0

Vous avez raison de dire que le rendu vaut mieux que de le rediriger dans la mesure du possible. s pas toujours possible; voir http://stackoverflow.com/questions/5175385/where-to-render-comments-controller-in-rails-on-model-validations-failure/8706403#8706403 –

Questions connexes