2011-05-24 82 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