Rails:控制器、视图和帮助器的生命周期

3

我想知道是否有相关文档。我相信了解这些对象何时创建和销毁以及它们是否被重用(如Java servlets)是有帮助的。特别是,我想知道有关helpers的情况。我假设每个新请求都会创建一个新的控制器实例,并且对于视图也是如此,但对于helpers则不然。在他的教程中,Michael Hartl使用SessionsHelper来存储当前用户,这让我认为helper的生命周期与会话绑定。这正确吗?那么从技术上讲,我可以使用helpers来存储会话信息,对吗?


1
如果你在这方面找到了任何东西,我会感兴趣并且希望你能在这里留言告诉我。话虽如此,我敢肯定帮助程序(如果它们在请求之间保持不变)不会是线程安全的,也许在会话之间也不是隔离的。 - Benj
有趣的问题 :) - Richard Peck
2个回答

3
基本流程如下:
(request) -- Rack stuff -- Controller instance -- View instance -- (response) 

在控制器(Controller)中设置的任何实例变量都可以在视图(View)中使用。它们是线程安全的。相反的,类变量则不是线程安全的。

Helper是模块(Module),而不是类(Class),因此它们不能被实例化。相反地,它们被混合(mix)到评估您的模板的视图实例中。同样,实例变量是线程安全的,类变量则不是。


1

我的想法是,像 Rails 应用程序的其他部分一样,帮助方法在每个请求时都会被创建和销毁。

你必须记住,帮助方法不会“存储”任何会话数据 - 它们只会调用会话 cookie来显示相关数据:

大多数应用程序需要跟踪特定用户的某些状态。这可以是购物篮的内容或当前已登录用户的用户 ID。如果没有会话的概念,用户将不得不在每个请求上识别并可能进行身份验证。如果一个新用户访问应用程序,Rails 将自动创建一个新会话。如果用户已经使用了该应用程序,则会加载现有会话。

会话通常由值的哈希和会话 ID(通常为 32 个字符的字符串)组成,以标识哈希表。发送到客户端浏览器的每个 cookie 都包括会话 ID。反之亦然:浏览器将在客户端的每个请求中将其发送到服务器。在 Rails 中,您可以使用 session 方法保存和检索值:

这对我来说至少证明了每次加载“helper”时,它实际上是依赖于用户存储的数据(特别是会话数据)。这意味着,尽管助手的生命周期可能似乎超出了每个请求,但它实际上只是依赖于提供的数据。
话虽如此,我需要阅读关于如何使其线程安全等方面的信息,就像benjamin sinclaire的评论所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接