【问题标题】:Rails - save controller instance variable data across HTTP requestRails - 跨 HTTP 请求保存控制器实例变量数据
【发布时间】:2016-09-28 23:05:54
【问题描述】:

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

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

但实例变量在 HTTP 请求中不可用。 因此,我可以使用哪些选项来跨 HTTP 请求保留实例变量值。不选择 DB 的另一个原因是,我不需要保留数据。只要用户登录,数据只需要在该时间段内存在。一旦用户退出,我可以丢弃数据。

如果您需要更多信息,请告诉我。

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不建议这样做,但您可以将数据存储在会话变量或 cookie 中。
    为什么在用户登录时需要存储这么多数据?是否可以只保存重要的部分?

    【讨论】:

      【解决方案3】:

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

      首先,确定大小限制,因为您希望用户提供文本文件,然后使用数据库中的参考路径临时上传文件。可以在需要时清理此文件,并使访问内容变得简单。要进一步改善这一点,请启用缓存机制并为上传的文件设置缓存服务器。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-11-01
        相关资源
        最近更新 更多