ruby on rails-Helper方法不更新Controllers实例变量



我在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 

相关内容

  • 没有找到相关文章

最新更新