2012-02-21 11 views
8

Questa è una domanda concettuale e non sono stato in grado di trovare la risposta in SO, quindi eccomi qui:Perché utilizzare le variabili di istanza per "collegare" i controller alle viste?

Perché le variabili di istanza vengono utilizzate per connettere controller e viste? Non abbiamo due oggetti diversi di due classi diverse (Controller vs Visualizzazioni). Quindi, quando la vista viene renderizzata, ci troviamo in un contesto diverso, ma stiamo usando le variabili di istanza di un altro oggetto? Non è questo incapsulamento di rottura in qualche modo?

In che modo Rails riesce a eseguire tale corrispondenza da un oggetto a un altro? Clona tutte le variabili istanze del controller alla vista?

+1

@ meggar, in realtà utilizza direttamente le variabili. Vedi 'BasicObject # instance_eval' nei documenti Ruby e vedrai come questo può essere. Controlla anche "Binding". –

risposta

6

In un certo senso, si potrebbe dire che sta rompendo l'incapsulamento. Ho scoperto che se non si presta attenzione, è facile riunire la logica di business/presentazione in Rails. Di solito inizia quando scrivo un modello di visualizzazione e scopro che ho bisogno di un valore che non ho passato dal controller. Quindi torno indietro e ritocco il controller per adattarlo alle esigenze della vista. Dopo un tweak, e un altro, e un altro, si guarda al metodo del controller e si stanno impostando tutti i tipi di variabili di istanza che non hanno senso a meno che non si guardi la vista per vedere a cosa servono. Quindi finisci in una situazione in cui devi controllare sia il controller che la vista per capire entrambi, piuttosto che essere in grado di prendere l'uno o l'altro in isolamento.

Penso che l'uso di variabili di istanza (insieme alla Binding trucco) è semplicemente un modo per passare qualunque valori è necessario da controller a visualizzare, senza dover dichiarare i parametri in anticipo (come si farebbe quando si definisce un metodo). Nessuna dichiarazione significa meno codice da scrivere e meno da cambiare quando si desidera refactoring e riorganizzare le cose.

4

Rails utilizza eval e Binding per passare le variabili dell'istanza del controllore alle viste. Vedi this presentation from Dave Thomas, c'è un piccolo esempio al minuto 46 'che spiega come è fatto.

+0

Se ho capito bene l'OP faceva riferimento a '@ variables' mentre l'associazione è utile per inviare le variabili a partial (nella gente del posto). Cose interessanti, però. – tokland