所以...我有一点难题。
我写了一些机架中间件,它存放在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)
config.after_initialize do
config.middleware.insert_before 0, 'Middleware::EatBacon'
end
但是现在应用程序运行时没有加载中间件,即Thread.current[:mouth]
永远不会得到培根
在config / environments / test.rb和config / environments / production.rb中必须以不同的方式实现这一点似乎很奇怪,但我想这就是我最终会做的事情,除非有人有更好的想法
答案 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'
...