【问题标题】:Build 2 middleware stacks in Rails app在 Rails 应用程序中构建 2 个中间件堆栈
【发布时间】:2015-11-29 12:17:39
【问题描述】:

我有一个 Rails 应用程序提供网站和 api。
我不希望某些元素出现在 API 的中间件堆栈中,例如:ActionDispatch::CookiesActionDispatch::Session::CookieStoreActionDispatch::Flash
网站的中间件堆栈保持正常。

那我该怎么做呢?谢谢。

【问题讨论】:

    标签: ruby-on-rails rails-api


    【解决方案1】:

    我也有同样的情况,也想做同样的事情。到目前为止,我已经能够使用 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. 以进行预先加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多