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

目前我已经确定了app/middleware,但我可以很容易地将其移动到vendor/middlewarevendor/plugins/middleware...

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

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

否则我会在config.middleware.use行上得到未初始化的常量错误.这可能会很快变得一团糟.我宁愿把它藏在某个地方的初始值中.

有没有一个传统的地方可以放这些东西?


我用这份赏金寻找的具体答案是:where can I put the require lines so that they are not cluttering the environment.rb file but still get loaded before the config.middleware.use calls?我所try 的一切都会导致未初始化的持续错误.


Update:现在我们使用的是Rails 3.0,我对待Rails应用就像对待其他Rack 应用一样;中间件的代码文件有lib个(或Gemfile中列出的一个gem),在config.ru中需要并加载.

推荐答案

从Rails 3.2开始,Rack 中间件属于app/middleware目录.

它"开箱即用",没有任何明确的require语句.

快速示例:

我正在使用一个名为CanonicalHost的中间件类,它在app/middleware/canonical_host.rb中实现.我在生产中增加了以下产品线.rb(注意中间件类是显式给出的,而不是作为带引号的字符串,它适用于任何特定于环境的配置文件):

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

如果要将中间件添加到application.rb中,则需要按照@mltsy's comment添加引号.

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

Ruby-on-rails相关问答推荐

错误正在被ViewComponent、Ruby on Rails中吞噬

`heroku Open`和`heroku run rake db:Migrate`不工作(";没有这样的文件或目录";)

如何从 New Relic 交易中获取 TraceId?

Rspec期望()与期望{}

Rails 3.1 assets资源 - 奇怪的开发服务

Rails 和 jsonb 类型jsonb不存在

禁用冻结字符串文字注释判断

Rails cron 与时俱进,设置环境

如何从 Rails 路由中删除控制器名称?

RSpec 设置会话对象

如何在 Rails 中验证日期以使其在今天之后?

为什么 respond_with 被从 rails 4.2 移除到它自己的 gem 中?

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

如何检测我的代码是否在 Rails 3 的控制台中运行?

你如何覆盖 form_for 助手中的类名?

在rails国际化yml文件中传递变量

活动管理员:仅自定义新表单

如何从 rails 控制器操作发出 404 响应?

扩展 Devise SessionsController 以使用 JSON 进行身份验证

为什么 rails bootstrap 这么慢,我该怎么办?