Rails - 跨HTTP请求保存控制器实例变量数据

时间:2016-05-31 05:00:15

标签: ruby-on-rails

在我的项目中,用户正在上传需要阅读的文本文件。

文件,可以是任何大小,我使用的文件是1 MB,有~1500行。该文件也可以更大。因此,我没有将所有内容放入db中,而是考虑处理文件并将数据保留在实例变量中。

但实例变量在HTTP请求中不可用。 因此,我可以选择在HTTP请求中保留实例变量值的选项。不选择DB的另一个原因是,我不需要保留数据。只要用户登录,数据就只能在该持续时间内出现。用户退出后,我可以丢弃数据。

如果您需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:1)

正如@xyious建议的那样,我会说避免在会话中存储那么多数据,这不是一个好习惯。但是,您可以执行以下操作:

  1. 设置系统范围的配置设置,该设置包含存储临时文件的路径,在本例中为用户上传的文件
  2. 当用户上传文件并将此文件存储在第1点提到的路径中时,生成随机(可能带有SecureRandom.hex)文件名
  3. 将此随机文件名存储在用户会话中,即使您在请求之间切换仍然可以访问文件名
  4. 在每个请求中,每当您需要处理数据时,从用户的会话中提取文件名并加入#1设置的路径,从文件系统中读取文件并根据需要进行处理
  5. 在您的登录/会话控制器上添加一个回调,以便当用户注销时,您可以在注销前找到文件名并将其删除,这样就不会保留未使用的文件

答案 1 :(得分:0)

我会反对它,但您可以将数据存储在会话变量或cookie中 为什么在用户登录时需要存储那么多数据?是否可以只保存重要的位?

答案 2 :(得分:0)

使用实例变量来存储内容不是一种正确的方法,因为您没有对上传的文件大小进行限制,并且您最终每次都会传递数据。

首先,确定大小限制的内容,因为您希望来自用户的文本文件,然后使用DB中的引用路径临时上载文件。可以在需要时清理此文件,这将使访问内容变得简单。要进一步改进此功能,请启用缓存机制并为上载的文件设置缓存服务器。

如果您对此不满意,那么我能想到的其他选项是使用已建议的会话变量。因此,这些数据将保留在每个会话中,符合您的要求。你可以session[:file_Data] = "put parsed content here"