Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails中控制器类和普通类的区别_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails RubyonRails中控制器类和普通类的区别

Ruby on rails RubyonRails中控制器类和普通类的区别,ruby-on-rails,ruby,Ruby On Rails,Ruby,我相信控制器与用户会话有关。因此,如果用户被引导到某个操作,比如说mycontroller#index,然后用户继续执行其他操作,如show,则index中的数据将丢失。我不确定它是否是这样工作的。但我对控制器和常规ruby类感到困惑。我的意思是,控制器也是类,不是吗?就像其他ruby类一样。。要记住的主要区别是什么?如果我没有弄错的话,我已经知道了一个,那就是,在控制器中,您不能像在常规ruby类中那样轻松地在方法之间共享数据。有没有人能解释一下其他的不同点,或者解开我关于这个话题的神秘感?先

我相信控制器与用户会话有关。因此,如果用户被引导到某个操作,比如说
mycontroller#index
,然后用户继续执行其他操作,如
show
,则
index
中的数据将丢失。我不确定它是否是这样工作的。但我对控制器和常规ruby类感到困惑。我的意思是,控制器也是类,不是吗?就像其他ruby类一样。。要记住的主要区别是什么?如果我没有弄错的话,我已经知道了一个,那就是,在控制器中,您不能像在常规ruby类中那样轻松地在方法之间共享数据。有没有人能解释一下其他的不同点,或者解开我关于这个话题的神秘感?先谢谢你!:-)

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

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

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

cookies[:foo]
cookies.signed[:foo]
cookies.permanent[:foo]
cookies.permanent.signed[:foo]
有关Cookie的更多信息,请参阅


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

tl;dr:用户变量必须来自用户端(cookies),而不是服务器端,否则每个用户只能看到一大罐数据

当我开始使用rails时,这也让我感到困惑。我试着制作一些
attr\u访问器
s,应用程序完全失控了。让我们看看为什么会这样

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


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

非常感谢您的解释。我有一个常规的ruby类,它可以解析我的csv文件并将记录存储在散列中。这个散列可以用在我的控制器方法中吗?我将如何构建它?这会导致用户会话之间出现问题吗?谢谢大家!@塔兹曼:当然,你可以在你的控制器中使用这个散列。你想用csv哈希做什么?设置完全取决于您试图使用它的目的。在用户移动到另一个页面之前,我将向索引页面显示csv数据。一旦用户离开页面,数据就会消失back@TazMan我不确定这样做的最佳方式,但如果您希望用户只查看一次信息,则需要在某个位置存储一个值,以告知每个用户是否已看到该信息。如果您只是使用一个类变量来存储已经看到该信息的用户数组,那么当您重新启动Rails服务器时,它将被重置,除非您将该数组存储在数据库中。或者,您可以为每个用户设置一个cookie,声明他们已看到该信息,但该用户将有权删除该cookie并再次看到该信息。