控制器类和ruby on rails上的普通类之间的差异

时间:2014-03-03 04:25:50

标签: ruby-on-rails ruby

我相信控制器与用户会话联系在一起。因此,如果某个用户被定向到某个操作,可以说mycontroller#index,然后用户继续执行其他操作,例如show,那么来自index的数据就会丢失。我不确定这是否有效。但我对控制器和常规ruby类感到困惑。我的意思是,控制器也不是他们的课程吗?就像任何其他红宝石类一样..要记住的主要区别是什么?如果我没有弄错的话,我已经知道了一个,也就是说,你不能像在普通的ruby类中那样在控制器中轻松地在方法之间共享数据。有人可以解释一些其他的差异或揭开我的菜鸟的神秘面纱,如同与此话题相关的问题吗?先感谢您! : - )

2 个答案:

答案 0 :(得分:0)

虽然控制器是Ruby类,但默认情况下它们不会在操作之间共享数据。这是因为您通常在每个方法或操作中使用实例变量(例如@user)。这些变量仅存在于控制器的一个实例中,并且为每个请求创建一个新实例。这意味着一旦一个请求结束,下一个请求就不会有任何相同的实例变量。通常这是一件好事,因为您通常不希望用户不共享他们的数据。

如果您希望在操作之间共享信息的持久方式,但每个用户的值都相同,则可以使用类变量(例如@@user)。

在每个用户更独特的操作之间共享信息的另一种方法是使用cookie。从本质上讲,您可以设置仅适用于一个会话,永久或“签名”的cookie。签名是为了确保用户无法更改cookie的值。以下是您可以设置和阅读的不同类型的cookie:

cookies[:foo]
cookies.signed[:foo]
cookies.permanent[:foo]
cookies.permanent.signed[:foo]

有关Cookie的更多信息,请参阅documentation

Rails还有session,可以设置为使用不同的存储方法,并且非常灵活。

答案 1 :(得分:0)

tl; dr:用户变量必须来自用户端(cookie),而不是服务器,否则每个用户只会查看一大堆数据混合。

当我开始使用rails时,这也让我感到难过。我试图制作一些attr_accessor s,应用程序完全陷入困境。所以,让我们看看为什么会这样。

您的应用可能会被许多人同时使用。即多个人访问同一段代码。因此,诸如实例变量之类的东西不应该(不应该)用于在动作(方法)之间共享数据,因为不知道谁得到了什么。

相反,我们使用数据库和会话将用户链接到一组沙盒,其中一组变量仅对应于他。对于任何其他用户,会话中会出现另一组相同的变量。这样,可以在用户之间保持互斥。