【发布时间】:2015-11-29 12:17:39
【问题描述】:
我有一个 Rails 应用程序提供网站和 api。
我不希望某些元素出现在 API 的中间件堆栈中,例如:ActionDispatch::Cookies、ActionDispatch::Session::CookieStore 或 ActionDispatch::Flash。
网站的中间件堆栈保持正常。
那我该怎么做呢?谢谢。
【问题讨论】:
我有一个 Rails 应用程序提供网站和 api。
我不希望某些元素出现在 API 的中间件堆栈中,例如:ActionDispatch::Cookies、ActionDispatch::Session::CookieStore 或 ActionDispatch::Flash。
网站的中间件堆栈保持正常。
那我该怎么做呢?谢谢。
【问题讨论】:
我也有同样的情况,也想做同样的事情。到目前为止,我已经能够使用 Rails 引擎 添加 某些路由没有问题的中间件(尽管它不一定在堆栈中的“正确顺序”,但到目前为止似乎工作正常):
application.rb:
# after Bundler.require(...)
require_relative '../lib/engines/website/lib/website'
lib/engines/website/lib/website.rb:
require_relative "website/engine"
module Website; end
lib/engines/website/lib/website/engine.rb:
module Website
class Engine < ::Rails::Engine
middleware.use ActionDispatch::Cookies
middleware.use ActionDispatch::Session::CookieStore
middleware.use ActionDispatch::Flash
end
end
config/routes.rb:
mount Website::Engine => "/website"
(或者你可以挂载在“/”,但是define your other routes first in that case)
网站的所有内容都在引擎目录下的典型目录结构中:
lib
engines
website
app
assets
...
controllers
...
views
...
config
routes.rb
lib
website
website.rb
我还没有走多远,但到目前为止这对我有用。
注意:从技术上讲,引擎文件甚至不必是网站目录中的单独文件。如果没有什么特别复杂的东西要添加到您的 lib 目录中,您可以将其推入 website.rb 并使其成为一个文件奇迹。我发现的唯一要求是文件 确实 必须位于引擎自己命名目录内的 lib 目录中(理论上包含 config/routes.rb 和引擎文件结构的其余部分),因为当应用程序预先加载 Rails::Engine 时,引擎会查找其 lib 目录以找到相邻的 app, config, vendor, etc. 以进行预先加载。
【讨论】: