Helper方法不会更新Controllers实例变量

时间:2011-05-24 13:45:58

标签: ruby-on-rails helpers instance-variables

我在Pages Controller中定义了一个instance_variable,并用一些字符串初始化它。

我在页面中包含了instance_variable。

出现了。

大!

如果我的页面包含一些_header布局,它使用了一个更新该instance_variable的Pages Helper方法,那么我的页面会显示原始而不是更新的字符串。

日志显示_header是在页面之前呈现的,所以它确实调用了一个Pagers Helper方法,该方法在呈现页面之前更新了instance_variable。

那么为什么该页面不包含更新的字符串?

我是RoR的新手,试图了解它的工作原理。

提前致谢!

编辑:

好。即使rails服务器日志显示, yield ed页面已经在渲染 ed页面之后呈现...看起来它已经在之前呈现 / em>他们。

如果我在第一个呈现编辑页面中更改了instance_variable,则更改的值可用于以后所有呈现编辑页面,但未更改 yield ed页面中,即使 yield 位于 render 之间(在application.html.erb中)和rails服务器日志显示甚至已经渲染为最后一个。

编辑:

出于某种原因,我使用'布局'这个词,我不得不使用'partials'这个词。

2 个答案:

答案 0 :(得分:0)

实例变量在对象之间复制,而不是共享。在视图中,使用相同的名称创建新变量,并“指向”由控制器中的变量引用的同一对象。因此,如果为视图中的变量分配新值,则其他对象将不知道更改。

但是,如果您确实需要更改某个变量引用的对象,请修改该对象,而不是将新的对象分配给变量。一个例子会告诉你我的意思。

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

如果使用'replace'方法(String对象有这样的方法),那么您的控制器可能会看到更改。如果只是为变量分配一个新对象,控制器将不会看到更改。但是不要太信任我,因为我通常不会修改视图中的对象。试试吧。

答案 1 :(得分:0)

我对此也很好奇,所以我想看到“处理顺序”。这是该测试的结果。它为我澄清了一些事情......希望即使没有解决问题也能解决问题。所有观点都是haml。请原谅无关代码,即%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 = 
=@test 
%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