正确的方式加载rails和rspec的中间件

时间:2014-09-19 16:50:42

标签: ruby-on-rails ruby-on-rails-3 rspec rails-api

所以...我有一点难题。

我写了一些机架中间件,它存放在app/middleware/eat_bacon.rb的磁盘上,看起来像

module Middleware
  class EatBacon
    def initialize(app)
      @app = app
    end

    def call(env)
      Thread.current[:mouth] = 'Bacon'
      @app.call(env)
    end
  end
end

我正在尝试在rails-api中加载/使用一些中间件(rails 3.2.19)

在我的config/application.rb我已经用两种不同的方式加载中间件,一种方式在运行应用程序时有效,另一种方式适用于rspec

适用于运行应用

config.middleware.insert_before 0, 'Middleware::EatBacon'

但是当我运行rspec时,我得到了

  

/Volumes/HardDrive/Me/.rvm/gems/ruby-2.0.0-p451@bacon/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:230:in,clock in constantize ':未初始化的常量中间件(NameError)

适用于RSpec

config.after_initialize do
  config.middleware.insert_before 0, 'Middleware::EatBacon'
end

但是现在应用程序运行时没有加载中间件,即Thread.current[:mouth]永远不会得到培根

在config / environments / test.rb和config / environments / production.rb中必须以不同的方式实现这一点似乎很奇怪,但我想这就是我最终会做的事情,除非有人有更好的想法

1 个答案:

答案 0 :(得分:1)

我解决这个问题的方法是先将中间件移到lib文件夹:

lib/middleware/eats_bacon.rb

然后,在config/application.rb我添加了require_relative,以便该文件现在看起来像

...

Bundler.require(*Rails.groups)
require_relative '../lib/middleware/eats_bacon.rb'

module BaconEaterApp
  class Application < Rails::Application

...

然后在该文件的底部

...

# Middleware
config.middleware.insert_before 0, 'Middleware::EatBacon'

...