web-dev-qa-db-fra.com

Rendu d'un contrôleur utilisant les vues d'un autre contrôleur

J'ai QuestionController J'ai maintenant AnotherQuestionController avec des actions qui devraient être rendues à l'aide de modèles et de partiels dans app/views/question / Est-ce possible? On dirait que cela devrait être.

J'ai essayé 

render :template => "question/answer"

mais answer.html.erb inclut des partiels et des erreurs telles que 

"Modèle manquant another_question/_my_partial.erb dans le chemin de la vue"

Alors, y a-t-il un moyen de dire à Rails "de traiter AnotherQuestionController comme s'il s'agissait de QuestionController et de rechercher des vues et des partiels dans app/views/question"? Ou devrais-je créer app/views/another_question - ce qui entraînera une duplication (cela ne peut pas être la méthode Rails).

Merci

33
Paul

Le rendu des modèles devrait réellement fonctionner

 render :template => "question/answer"

Le problème que vous aviez est dû aux partiels qui cherchent au mauvais endroit. Le correctif est simple, il suffit de rendre vos partiels absolus dans tous les modèles partagés. Par exemple, question/answer.html.erb devrait avoir

<%= render :partial => 'question/some_partial' %>

plutôt que d'habitude

<%= render :partial => 'some_partial' %> 
50
Ben Hughes

Vous pouvez y arriver avec:

render 'question/answer'
12
klew

Rails utilise une liste de préfixes pour résoudre les modèles et les partiels. Bien que vous pouvez spécifiez explicitement un préfixe ("question/réponse"), comme suggéré dans une autre réponse, cette approche échouera si le modèle lui-même inclut des références non qualifiées à d'autres partiels.

En supposant que vous ayez une super-classe ApplicationController et que QuestionController en hérite, les emplacements que Rails rechercherait pour les modèles sont, dans l'ordre, "app/views/question /" et "app/views/application /". (En fait, cela ressemblera aussi à une série de chemins de vue, mais je passe à côté de ça par souci de simplicité.)

Compte tenu de ce qui suit:

class QuestionController < ApplicationController
end

class AnotherQuestionController < ApplicationController
end

QuestionController._prefixes
# => ["question", "application"]
AnotherQuestionController._prefixes
# => ["another_question", "application"]

Solution n ° 1. Placez le partiel sous "app/views/application /" au lieu de "app/views/question /", où il sera disponible pour les deux contrôleurs.

Solution n ° 2. Hériter de QuestionController, le cas échéant.

class AnotherQuestionController < QuestionController
end
=> nil
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]

Solution n ° 3. Définit la méthode de classe AnotherQuestionController :: local_prefixes

Cela a été ajouté dans Rails 4.2.

class AnotherQuestionController < ApplicationController
  def self.local_prefixes
    super + ['question']
  end
end
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]
0
Steve

Vous pouvez essayer le plugin inherit_views ( http://github.com/ianwhite/inherit_views/tree/master ) que j'ai mentionné ici dans la réponse à cette question .

0
Shadwell