這是一個概念性問題,我一直沒能找到答案,所以我在這裏:爲什麼使用實例變量將控制器與視圖「連接」?
爲什麼實例變量用於連接控制器和視圖?我們沒有兩個不同類的兩個不同的對象(Controller vs Views)。所以,當視圖呈現時,我們處於不同的上下文中,但我們正在使用另一個對象的實例變量?這是不是破壞封裝在某種程度上?
Rails如何管理從一個對象到另一個對象的匹配?它是否將控制器的所有實例變量克隆到視圖中?
這是一個概念性問題,我一直沒能找到答案,所以我在這裏:爲什麼使用實例變量將控制器與視圖「連接」?
爲什麼實例變量用於連接控制器和視圖?我們沒有兩個不同類的兩個不同的對象(Controller vs Views)。所以,當視圖呈現時,我們處於不同的上下文中,但我們正在使用另一個對象的實例變量?這是不是破壞封裝在某種程度上?
Rails如何管理從一個對象到另一個對象的匹配?它是否將控制器的所有實例變量克隆到視圖中?
從某種意義上說,你可以說它正在破壞封裝。我發現如果你不小心,很容易讓你的商業/演示邏輯在Rails中混合在一起。它通常在我寫視圖模板時開始,並且發現我需要一些我沒有從控制器傳遞過來的值。所以我回去,並調整控制器,以適應我所需要的視野。經過一次調整,另一次,另一次,你看看控制器的方法,它是設置各種實例變量,這是沒有意義的,除非你看視圖,看看他們是什麼。所以你最終會遇到這樣一種情況:你需要同時查看控制器和視圖來理解,而不是單獨採取一種或另一種。
我認爲使用實例變量(和Binding
技巧一起)只是一種簡單的方法,無需事先聲明參數(就像定義方法時那樣),從控制器傳遞需要從控制器查看的任何值。沒有聲明意味着編寫的代碼更少,而當您想要重構和重組時,更少的代碼需要更改。
Rails使用eval和Binding將控制器實例變量傳遞給視圖。請參閱this presentation from Dave Thomas,第46分鐘處有一個小例子,說明這是如何完成的。
如果我理解正確,OP指的是「@變量」,而綁定對發送變量部分(在本地)是有用的。有趣的東西,但。 – tokland 2012-12-12 12:16:36
@meggar,實際上,它直接使用變量。請參閱Ruby文檔中的'BasicObject#instance_eval',您將看到如何做到這一點。另外檢查'綁定'。 – 2012-02-21 21:27:16