8
votes

Comment passer des objets d'un contrôleur à un autre dans des rails?

J'ai essayé d'avoir la tête autour de rendu_to, mais je n'ai pas eu beaucoup de succès.

essentiellement, j'ai des méthodes de contrôleur: xxx

ce que je peux ' t comprendre est comment accomplir cela. À l'origine, je voulais juste rendre le premier fichier.html.erb, mais cela ne semblait pas fonctionner non plus.

Merci

Edit: J'apprécie les réponses que j'ai reçues, mais tous d'entre eux ont tendance à éviter d'utiliser la méthode de rendu ou Redirect_to. Est-ce fondamentalement le cas que vous ne pouvez pas passer des variables du contrôleur au contrôleur? Je dois penser qu'il y a un moyen mais je ne peux pas sembler le trouver.


0 commentaires

4 Réponses :


2
votes

Je n'ai généralement pas mes contrôleurs qui appellent les actions de chacun. Si vous avez un identifiant qui commence par une lettre majuscule, en rubis qui est une constante. Si vous souhaitez une variable de niveau d'instance, faites-le commencer par @.

@var1 = ["Hello", "Goodbye"]


2 commentaires

Essentiellement, j'essaie de faire un processus en plusieurs étapes dans lequel un utilisateur télécharge un fichier, puis je le traite et re-présentez-le à leur permettre de les laisser apporter certaines modifications, puis insérez-la enfin dans une base de données. Pour ce faire, je dois pouvoir transmettre cet objet à un autre contrôleur ou au moins une autre vue de contrôleurs.


Plutôt que de faire cela pourquoi ne pas stocker les résultats intermédiaires de votre fonctionnement dans la base de données et le signaler comme incomplet. De cette façon, vous savez que vous avez accès à travers le modèle normal et que vous êtes résilient aux défaillances du serveur.



23
votes

Ce n'est pas une bonne idée d'assigner l'objet à une constante. Ceci est dans un espace global, mais il est global pour tout le monde afin que tout autre utilisateur puisse faire cette demande obtiendra cet objet. Il y a quelques solutions à cela.

Je suppose que vous avez une forme en plusieurs étapes que vous traversez. Dans ce cas, vous pouvez transmettre les attributs définis comme champs masqués. P>

def first
  @item = Item.new(params[:item])
  session[:item_attributes] = @item.attributes
end

def second
  @item = Item.new(session[:item_attributes])
  @item.attributes = params[:item]
end


2 commentaires

Salut Ryan, est l'option de session toujours valable dans les rails 3? Si je stocke @ item.Attributes Il stocke des attributs protégés tels que ID et Timestamps en tant que nil, tenter de créer un nouvel objet à partir de cette session entraîne une erreur de massassIssignmationCrity


objet.atributes.slice ('champ1', 'champ2') semble être le moyen d'aller simplement remplacer le champ1 et le champ2 avec quels champs sont nécessaires.



2
votes

Avez-vous envisagé d'utiliser le hachage flash? Beaucoup de gens l'utilisent uniquement pour les messages d'erreur et similaires, il est explicitement pour le type de transaction de données qui vous intéressent peut-être.

Fondamentalement, la méthode Flash renvoie un hachage. Toute valeur que vous attribuez à une clé dans le hachage sera disponible pour l'action suivante, mais elle est partie. Donc: P>

def first
  flash[:var] = ["hello", "goodbye"]
  redirect_to :action => :second
end

def second
  @hello = flash[:var].first
end


0 commentaires

2
votes
  1. Way 1
    Variable globale (échec pendant les demandes simultanées) li>
  2. Way 2
    variable de classe (échec pendant les demandes simultanées) li>
  3. Way 3
    P>

    • STASH L'objet sur le serveur entre les demandes. La manière typique est de le sauvegarder dans la session, car elle sérialise automatiquement / désériorialise l'objet pour vous. Li>
    • sérialiser l'objet et y inclure sous la forme quelque part, et désérialisez-le des paramètres de la demande suivante. Vous pouvez donc stocker des attributs de la session. P>

      class BarsController < UsersController
        before_filter :init_foo_list
      
      def method1
           render :method2
         end 
      
      def method2
           @foo_list.each do | item|
             # do something
          end
         end
      
      def init_foo_list
           @foo_list ||= ['Money', 'Animals', 'Ummagumma']
         end
       end 
    • Way 4
      Le flash fournit un moyen de passer des objets temporaires entre les actions. Tout ce que vous placez dans le flash sera exposé à l'action très suivante, puis éliminé.
        Rails.cache.write("list",[1,2,3])
        Rails.cache.read("list")
      
    • Way 5
      Vous pouvez utiliser le cache de rails. p> xxx pré> Mais que se passe-t-il lorsque différentes sessions ont des valeurs différentes? Sauf si vous assurez le caractère unique du nom de la liste à travers la session, cette solution échouera lors de demandes simultanées li>

    • Way 6
      Dans un magasin d'action, la valeur de la table DB basée sur l'ID de session et d'autres actions peut la récupérer à partir de la DB basée sur l'ID de session. P> LI>

    • Way 7
      P>

       def new
         @test_suite_run = TestSuiteRun.new
         @tests = Test.find(:all, :conditions => { :test_suite_id => params[:number] })
         flash[:someval] = params[:number]
       end 
       def create
         @test_suite_run = TestSuiteRun.new(params[:test_suite_run])
         @tests = Test.find(:all, :conditions => { :test_suite_id => flash[:someval] })
       end 
    • Way 8
      De l'action envoyée à la vue et à nouveau de la vue envoyée à d'autres actions dans Controller. P> LI> ol>


0 commentaires