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

| 我在页面控制器中定义了instance_variable,并使用一些字符串对其进行了初始化。 我在页面中包含了该instance_variable。 它出现了。 大! 如果我的页面包含某些_header布局,并使用Pages Helper方法更新了instance_variable,则我的页面将显示原始字符串,而不是更新的字符串。 日志显示_header是在页面之前呈现的,因此它确实调用了Pagers Helper方法,该方法在呈现我的页面之前更新了instance_variable。 那么,为什么该页面不包含更新的字符串? 我是RoR的新手,试图了解它的工作原理。 提前致谢! 编辑: 好。即使rails服务器日志显示,也已在渲染页面之后渲染了yield页面,看起来好像已经在它们之前渲染了页面。 如果我在第一个渲染页面中更改instance_variable,则更改后的值在所有后续渲染页面中均可用,但在yield页面中则不变,即使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 \'方法(字符串对象具有这种方法),则您的控制器可能会看到更改。如果仅将新对象分配给变量,则控制器将看不到更改。但是不要太信任我,因为我通常不修改视图中的对象。只是测试一下。     
我也对此感到很好奇,所以我想看看“处理顺序”。这是该测试的结果。它为我澄清了一些事情...希望它能回答问题,即使不能解决问题。所有视图均为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 
    

要回复问题请先登录注册