我有一个Rails应用程序提供网站和API.
我不希望API的中间件堆栈中出现一些元素,例如:ActionDispatch :: Cookies,ActionDispatch :: Session :: CookieStore或ActionDispatch :: Flash.
网站的中间件堆栈保持正常.
我不希望API的中间件堆栈中出现一些元素,例如:ActionDispatch :: Cookies,ActionDispatch :: Session :: CookieStore或ActionDispatch :: Flash.
网站的中间件堆栈保持正常.
那我该怎么办呢?谢谢.
解决方法
我有完全相同的情况,并希望做同样的事情.到目前为止,我已经能够使用Rails引擎添加缺少的中间件而没有问题的某些路由(虽然它不一定在堆栈中的“正确顺序”,但到目前为止似乎工作正常):
application.rb中:
- # after Bundler.require(...)
- require_relative '../lib/engines/website/lib/website'
LIB /发动机/网站/ lib中/ website.rb:
- require_relative "website/engine"
- module Website; end
LIB /发动机/网站/ lib目录/网站/ engine.rb:
- module Website
- class Engine < ::Rails::Engine
- middleware.use ActionDispatch::Cookies
- middleware.use ActionDispatch::Session::CookieStore
- middleware.use ActionDispatch::Flash
- end
- end
配置/ 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
我还没有走得太远,但到目前为止,这对我有用.
注意:从技术上讲,引擎文件甚至不必是网站目录中的单独文件.您可以将它推入website.rb并使其成为一个文件 – 如果没有其他任何特别复杂的东西添加到您的lib目录.我发现的唯一要求是文件必须位于引擎自己的命名目录中的lib目录中(理论上包含config / routes.rb和引擎的其余文件结构),因为当Rails :: Engine时由应用程序急切加载,引擎查找其lib目录以找到相邻的app,config,vendor,etc.到eager-load.