代码之家  ›  专栏  ›  技术社区  ›  Adam Lassek

您将机架中间件文件和要求放在哪里?

  •  42
  • Adam Lassek  · 技术社区  · 14 年前

    我正在将Rails应用程序中内置的一些逻辑重构为中间件,我遇到的一个烦恼是,似乎缺少将它们放在何处的约定。

    app/middleware 但我可以很容易地把它移到 vendor/middleware 或者也许 vendor/plugins/middleware ...

    最大的问题是需要将单个文件放在 config/environment.rb

    require "app/middleware/system_message"
    require "app/middleware/rack_backstage"
    

    否则我会在 config.middleware.use 线。很快就会变得一团糟。我宁愿把它藏在某个地方。


    我在寻找这个悬赏的具体答案是: 我可以把require行放在哪里,这样它们就不会把文件弄得乱七八糟了environment.rb 但仍然在config.middleware.use 电话? 我所尝试的一切都会导致未初始化的常量错误。


    更新 lib (或在香港上市的创业板) Gemfile )需要并加载 config.ru .

    7 回复  |  直到 13 年前
        1
  •  48
  •   Community CDub    7 年前

    从Rails3.2开始,Rack中间件属于app/middleware目录。

    它“开箱即用”,没有任何明确的require语句。

    快速示例:

    我正在使用一个名为 典型宿主 应用程序/中间件/规范_host.rb 笔记

    config.middleware.use CanonicalHost, "example.com"
    

    application.rb ,您需要根据 @mltsy's comment .

    config.middleware.use "CanonicalHost", "example.com"
    
        2
  •  23
  •   Adam Lassek    14 年前

    lib/tableized/file_name.rb . 只要您试图加载的类可以通过其文件名发现,Rails就会自动加载所需的文件。例如:

    config.middleware.use "MyApp::TotallyAwesomeMiddleware"
    

    你应该保持:

    lib/my_app/totally_awesome_middleware.rb
    

    Rails捕获const_missing并尝试自动加载与丢失的常量对应的文件。只要确保你的名字匹配,你是肉汁。Rails甚至提供了漂亮的助手,可以帮助您轻松地识别文件的路径:

    >> ChrisHeald::StdLib.to_s.tableize.singularize
    => "chris_heald/std_lib"
    

    所以我的stdlib住在 lib/chris_heald/std_lib.rb ,并在代码中引用时自动加载。

        3
  •  11
  •   Craig Walker    11 年前

    在我的rails3.2应用程序中,我能够获得我的中间件 TrafficCop 把它放在 app/middleware/traffic_cop.rb config/application.rb ,按照说明:

    config.middleware.use TrafficCop
    

    但是,在应用程序启动时,我不断遇到以下错误:

    uninitialized constant MyApp::Application::TrafficCop
    

    config.middleware.use ::TrafficCop
    # uninitialized constant TrafficCop
    

    出于某种原因(我还没有发现),在Rails生命周期的这一点上, app/middleware 未包含在加载路径中。如果我取下 config.middleware.use 交通警察 没有任何问题。但它在里面找不到 应用/中间件

    我通过将中间件类名括在引号中解决了这个问题,如下所示:

    config.middleware.use "TrafficCop"
    

    uninitialized constant 刚刚上课。但是,当它开始构建中间件堆栈时,它将稳定字符串。到这个时候, 在加载路径中,因此类将正确加载。

        4
  •  5
  •   yfeldblum    14 年前

    #config/application.rb
    require 'lib/rack/my_adapter.rb'
    module MyApp
      class Application < Rails::Application
        config.middleware.use Rack::MyAdapter
      end
    end
    
        5
  •  0
  •   John Topley    14 年前

    /lib 目录?其中的文件由Rails自动加载。

        6
  •  0
  •   Jean    14 年前

    您可以创建一个需要必要文件的初始值设定项,然后将这些文件放在任何需要的地方。

    根据 this 初始化程序在加载机架中间件之前执行。

        7
  •  0
  •   Adam Lassek    14 年前

    到目前为止,我的工作解决方案是将中间件所需的 config/middleware.rb environment.rb ,把它减少到一个我能接受的要求。