我在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'这个词。
答案 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