2011-05-24 36 views
0

我在我的頁面控制器中定義了一個instance_variable,並用一些字符串初始化它。幫助程序方法不更新控制器實例變量

我在頁面中包含該instance_variable。

顯示出來。

太棒了!

如果我的頁面包含一些_header佈局,該佈局使用更新該instance_variable的Pages Helper方法,那麼我的頁面會顯示原始而不是更新的字符串。

日誌顯示_header是在頁面之前呈現的,因此它確實調用了Pagers Helper方法,該方法在它呈現我的頁面之前更新該instance_variable。

那麼爲什麼該頁面不包含更新的字符串?

我剛接觸RoR,試圖瞭解它是如何工作的。

在此先感謝!

編輯:

好吧。即使rails服務器日誌顯示,收益率 ed頁面已經在呈現 ed頁面之後呈現......看起來它已經在之前呈現它們。

如果我更改了第一的instance_variable呈現編輯頁面,更改的值在所有可用以下渲染版頁,但在產量版頁不變,即使產量介於呈現的(在application.html.erb中),並且rails服務器日誌顯示甚至已經渲染爲最後一個。

編輯:

出於某種原因,我的用戶詞「佈局」,其中我將不得不使用這個詞「的諧音」。

回答

0

這並不直接回答你的問題(對不起)!但是我認爲你會走錯方向。

RoR是一個MVC框架,視圖和幫助器不應該操縱數據。這應該是管制員的責任。

+0

無論如何感謝:) – krzysiek 2011-05-24 14:32:54

0

實例變量在對象之間被複制而不是共享。在視圖中,使用相同名稱創建新變量,並「指向」控制器中變量所引用的同一對象。因此,如果您爲視圖中的某個變量分配一個新值,其他對象將無法瞭解該變化。

但是,如果您確實需要更改某個變量引用的對象,請修改該對象而不是將新對象分配給某個變量。一個例子會告訴你我的意思。

@var = "a new string" # it creates a new String object. 
@var.replace "a modified string" # it changes the content of the object. 

如果使用「替代」的方法(String對象有這樣的方法),那麼你的控制器可以看到的變化。如果你只是給一個變量分配一個新的對象,你的控制器就不會看到這個變化。但不要太相信我,因爲我通常不會修改視圖中的對象。只是測試它。

+0

它沒有伎倆,但無論如何感謝!我會記住不要在它上繼續傳遞。 – krzysiek 2011-05-24 14:58:08

0

我也很好奇,所以我想看看「處理順序」。這是該測試的結果。它爲我澄清了事情......希望即使不解決問題,它也能回答這個問題。所有的觀點都在哈姆。赦免無關的代碼即%br。爲了簡潔起見,我正在尋求澄清。

控制器:

@test = 1 

助手:

def change_test 
    @test += 1 
end 

應用佈局:

!!! 
%html 
    %body 
    Application Layout Pre-change = 
    = @test 
    %br 
    Application Layout Change = 
    = change_test() 
    %br  
    = yield 

墓內檢視:

%br 
Pre-Header = 
= @test 
%br 
Pre Header change = 
= change_test() 
%br 
= render "test_header" 
%br 
Yeilded page Pre-change = 
[email protected] 
%br 
Yeilded Page Change = 
= change_test() 
%br 
= render "test_footer" 
%br 

部首部分:

%br 
Header Pre-change = 
= @test 
%br 
Header change = 
= change_test() 
%br 

頁腳部分:

%br 
Footer Pre-change = 
= @test 
%br 
Footer change = 
= change_test() 
%br 

輸出:

Application Layout Pre-change = 5 
Application Layout Change = 6 

Pre-Header = 1 
Pre Header change = 2 

Header Pre-change = 2 
Header change = 3 

Yeilded page Pre-change = 3 
Yeilded Page Change = 4 

Footer Pre-change = 4 
Footer change = 5 
+0

但這是不同的東西......你在渲染的視圖裏面調用change_test methode ......我的例子是......我的finall視圖是由許多奇異的視圖組成......我想知道爲什麼值是在已經呈現的視圖中保持不變_after_我確實調用了change_test方法的另一視圖... – krzysiek 2011-05-26 07:49:21

+0

我將用最新的「測試」修改我的答案 – DonaldSowell 2011-05-26 13:58:59

+0

[This page](http://apidock.com/rails/) v1.2.0/ActionController/Layout/ClassMethods)解釋了測試的結果 – DonaldSowell 2011-05-26 14:35:41