it-swarm.com.de

Ein Controller wird mit den Ansichten eines anderen Controllers gerendert

Ich habe QuestionController . Ich habe jetzt AnotherQuestionController mit Aktionen, die mithilfe von Vorlagen und Partials in app/views/question /[.____. Gerendert werden sollen.] Ist dies möglich? Scheint, als sollte es sein.

Ich habe es versucht 

render :template => "question/answer"

aber answer.html.erb enthält partials und ich bekomme Fehler wie 

Msgstr "Fehlende Vorlage other_question/_my_partial.erb im Ansichtspfad"

Gibt es eine Möglichkeit, Rails zu sagen, "AnotherQuestionController als seinen QuestionController zu behandeln und in app/views/question nach Ansichten und Partials zu suchen"? Oder muss ich app/views/another_question erstellen, was zu Duplizierungen führen kann (dies kann nicht der Rails-Weg sein).

Vielen Dank

33
Paul

Template-Rendering sollte eigentlich funktionieren

 render :template => "question/answer"

Das Problem, das Sie hatten, ist von den Teilstücken, die an der falschen Stelle suchen. Das Update ist einfach: Machen Sie Ihre Teiltöne in allen freigegebenen Vorlagen absolut. Beispiel: question/answer.html.erb sollte haben

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

eher als üblich

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

Sie können es erreichen mit:

render 'question/answer'
12
klew

Rails verwendet eine Liste von Präfixen, um Vorlagen und Teilbilder aufzulösen. Während Sie can explizit ein Präfix ("Frage/Antwort") angeben, wie in einer anderen Antwort vorgeschlagen, schlägt dieser Ansatz fehl, wenn die Vorlage selbst unqualifizierte Verweise auf andere Teilweisen enthält.

Angenommen, Sie verfügen über eine ApplicationController-Superklasse, und QuestionController erbt davon. Die Orte, an denen Rails nach Vorlagen sucht, sind in der Reihenfolge "app/views/question /" und "app/views/application /". (Eigentlich wird es auch in einer Reihe von Betrachtungspfaden aussehen, aber ich beschönige das der Einfachheit halber.)

Gegeben das Folgende:

class QuestionController < ApplicationController
end

class AnotherQuestionController < ApplicationController
end

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

Lösung # 1. Platzieren Sie das Partial unter "app/views/application /" anstelle von "app/views/question /", wo es für beide Controller verfügbar ist.

Lösung Nr. 2. Von QuestionController ggf. übernehmen.

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

Lösung Nr. 3. Definiere die Klassenmethode AnotherQuestionController :: local_prefixes

Dies wurde in Rails 4.2 hinzugefügt.

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

Sie könnten das Plugin für erbit_views ( http://github.com/ianwhite/inherit_views/tree/master ) versuchen, das ich hier in der Antwort auf diese Frage erwähnte.

0
Shadwell