【问题标题】:How exactly do you use Rack's env hash?你究竟是如何使用 Rack 的 env 哈希的?
【发布时间】:2015-06-27 15:59:23
【问题描述】:

我有一个 Rails 4.2 应用程序,文件上传流量很大。

我想覆盖rack.multipart.tempfile_factory,以便在接受文件上传时提供与 Rack 在后台创建的临时文件相关的其他行为。

那么我在哪里以及如何更改 Rack 的 env 哈希确切地?尝试在初始化程序中执行env['...'] = ...,说env 未定义。将其更改为 ENV 会引发错误,指出它无法将 lambda 转换为字符串(rack.multipart.tempfile_factory 需要 lambda,因此我不能将其更改为字符串)。在控制器方法中使用request.env 没有任何效果。我通过复制粘贴库存机架工厂的一行代码来测试最后一个,并将随机数添加到具有固定路径的文件中;上传几个文件后,该文件一开始就没有被创建,所以你去吧。

我正在寻找官方解决方案,并且无意对 Rack 进行猴子补丁。它的规范表明这是可能的,那么我应该怎么做呢?

当然,如果一切都失败了,我会求助于黑客,但我更愿意先听听官方的做法。

(虽然我们在这里,您能否推荐一个无宝石的解决方案来覆盖rack.hijack_io,并提供一些真实世界的示例?特别是搜索那个东西并不是很有帮助,似乎没有人提供端到端的工作解决方案,只有零碎)。

感谢您的考虑。

【问题讨论】:

    标签: ruby ruby-on-rails-4 file-upload rack


    【解决方案1】:

    第 1 部分:如何修改 Rack 的env

    您只需要覆盖Application#call。在config/application.rb(或者config/environments/production.rb,如果你喜欢)你添加这个方法:

    class Application < Rails::Application
      ...
      def call(env)
        env["rack.multipart.tempfile_factory"] = ->(what, now) { "lambda time" }
        super(env)
      end
      ...
    end
    

    有关更多信息,请参阅#call

    第二部分:ENV的含义

    ENV 是 Ruby 中对应于 shell 环境的常量。这允许您在 shell 脚本中执行以下操作:

    $ export MY_VAR=hahahaha
    ...
    irb> ENV['MY_VAR'] #=> "hahahaha"
    

    它不仅仅是一个 Rack 变量——它是一个 Ruby 常量!

    您的错误“无法将 lambda 转换为字符串”是因为所有 ENV 值都必须是字符串。所以即使你这样做了

    $ export MY_VAR=42
    

    你会得到

    irb> ENV['MY_VAR'] #=> "42"
    

    其中"42" 是字符串,而不是整数。

    【讨论】:

    • 我知道我是愚蠢的,这只是你生气的日子之一,你自己无法弄清楚这么简单的事情,你会更生气,从而失去所有能力真正解决它。非常感谢。 RE:第 2 部分,我知道 ENV 是什么,我非常沮丧,决定试一试(完全知道它不会起作用,哈哈)。感谢您的全面回答。我欠你 20 杯啤酒。
    • 不用担心,我想的差不多——但只是想添加第 2 部分以确保完整性。挖掘很有趣,因为我自己还没有真正深入到 Rails 的那一边。
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2019-11-20
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多