我在Pages Controller中定义了一个instance_variable,并用一些字符串初始化它。
我将instance_variable包含在页面中。
它出现了。
太棒了!
如果我的页面包含一些_header布局,该布局使用Pages Helper方法更新instance_variable,则我的页面将显示原始字符串,而不是更新后的字符串。
日志显示_header是在页面之前呈现的,因此它确实调用了Pagers Helper方法,该方法在呈现页面之前更新instance_variable。
那么,为什么该页面不包含更新后的字符串呢?
我是RoR的新手,正在努力了解它是如何工作的。
提前感谢!
编辑:
嗯。即使rails服务器日志显示yielded页面是在渲染ed页面之后渲染的。。。它看起来像是在之前渲染过的。
如果我在第一个rendered页面中更改instance_variable,则更改后的值在以下所有rendered页面中都可用,但在yielded页面中未更改,即使yield位于渲染之间(在application.html.erb中),rails服务器日志显示,即使是它也已被渲染为最后一个。
编辑:
出于某种原因,我使用了单词"layouts",而我不得不使用单词"partials"。
实例变量是在对象之间复制的,而不是共享的。在视图中,将创建具有相同名称的新变量,并"指向"控制器中的变量所引用的同一对象。因此,如果为视图中的变量指定一个新值,其他对象将不知道该更改。
但是,如果您确实需要更改某个变量引用的对象,请修改该对象,而不是为变量指定新对象。举个例子就能告诉你我的意思。
@var = "a new string" # it creates a new String object.
@var.replace "a modified string" # it changes the content of the object.
如果您使用"replace"方法(String对象有这样的方法),那么您的控制器可能会看到更改。如果您只是将一个新对象分配给一个变量,您的控制器将看不到更改。但不要太相信我,因为我通常不会修改视图中的对象。只需测试即可。
我对此也很好奇,所以我想看看"处理顺序"。这是测试的结果。它为我澄清了事情……希望它能回答问题,即使不能解决问题。所有视图都在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