Warum Instanzvariablen verwenden, um Controller mit Ansichten zu verbinden?

8

Dies ist eine konzeptionelle Frage und ich konnte die Antwort in SO nicht finden, also gehe ich hier:

Warum werden Instanzvariablen zum Verbinden von Controllern und Sichten verwendet? Haben wir nicht zwei verschiedene Objekte zweier verschiedener Klassen (Controller vs Views)? Wenn die Ansicht gerendert wird, befinden wir uns also in einem anderen Kontext, aber wir verwenden Instanzvariablen eines anderen Objekts? Ist das nicht irgendwie kaputt?

Wie schafft Rails diesen Abgleich von einem Objekt zum anderen? Kopiert es alle Instanzenvariablen des Controllers in die Ansicht?

    
Nobita 21.02.2012, 20:27
quelle

2 Antworten

6

In gewissem Sinne könnte man sagen, dass es die Kapselung bricht. Ich habe festgestellt, dass es leicht ist, wenn Sie nicht vorsichtig sind, dass Ihre Geschäfts- / Präsentationslogik in Rails zusammengeführt wird. Es beginnt normalerweise, wenn ich eine Ansichtsvorlage schreibe, und entdecke, dass ich einen Wert benötige, den ich nicht vom Controller übernommen habe. Also gehe ich zurück und wähle den Controller so aus, dass er zu dem passt, was ich in der Ansicht brauche. Nach einer Optimierung und einer anderen und einer anderen betrachten Sie die Controller-Methode und setzen alle Arten von Instanzvariablen, die keinen Sinn ergeben, es sei denn, Sie betrachten die Ansicht, um zu sehen, wozu sie dienen. Sie befinden sich also in einer Situation, in der Sie sowohl den Controller als auch die Ansicht betrachten müssen, um beides zu verstehen, anstatt in der Lage zu sein, das eine oder das andere zu isolieren.

Ich denke, dass die Verwendung von Instanzvariablen (zusammen mit dem Binding trick) einfach eine Möglichkeit ist, alle Werte, die Sie benötigen, vom Controller an die Anzeige zu übergeben, ohne Parameter im Voraus deklarieren zu müssen (wie beim Definieren einer Methode). Keine Deklarationen bedeuten weniger Code zum Schreiben und weniger zum Ändern, wenn Sie Dinge umstrukturieren und neu organisieren möchten.

    
Alex D 21.02.2012, 21:25
quelle
4

Rails verwendet eval und Binding , um Controller-Instanzvariablen an Sichten zu übergeben. Siehe diese Präsentation von Dave Thomas , es gibt ein kleines Beispiel in Minute 46 ', das erklärt, wie das gemacht wird.

    
mbreining 21.02.2012 21:07
quelle