【问题标题】:Rails Application with Two Different Bases (Base and API)具有两种不同基础(基础和 API)的 Rails 应用程序
【发布时间】:2016-02-22 07:20:51
【问题描述】:

我有兴趣将 API 添加到现有的 Rails 应用程序。我希望应用程序控制器继承自 ActionController::Base 和 Api 控制器继承自 ActionController::API 以便 API 端点上不存在不需要的中间件

我可以添加 rails-api gem(我被锁定在 rails 4.2),并根据需要调整包装参数初始化程序,但是当这种情况发生时,我的 rails 应用程序中的会话 ID 记录会中断。

同时使用 rails 和 rails-api 有问题吗?rails 应用程序可以有两个不同的基础吗?

为了便于讨论,假设我不能只制作一个单独的 rails-api 应用程序并将业务逻辑提取到 gems 中。

编辑:

我们有什么:

ActionController::Base
    \ ApplicationController
        \ RailsControllers
    \ ApiController
        \ RailsAPIControllers

我们想要什么:

ActionController::Base
    \ ApplicationController
        \ RailsControllers
ActionController::API
    \ ApiController
        \ RailsAPIControllers

我不确定是否必须在某些时候加载 Base ActionController 是否有任何实际差异。这个想法是,如果 RailAPIControllers 继承自 API ActionController,它们会更轻,但这样做会导致问题。

【问题讨论】:

    标签: ruby-on-rails ruby api


    【解决方案1】:

    内森,

    你最好的办法是创建一个 ApiController,你的所有 api 端点都继承自它,只渲染 json 并处理你所有的 session/auth 内容。这样您就不必担心支持这两种宝石的任何奇怪之处。

    对于 api,您很可能希望从 ActionController::Base 继承,除非 api 中的 session/before 操作内容会模仿 rails http 请求。如果是后者,则继承自ApplicationController。

    【讨论】:

    • 见我上面的编辑。无论如何,我们都想要一个 ApiController。问题是你从哪里继承。
    • 查看上面添加的评论
    【解决方案2】:

    我现在实际上在同一条船上,作为“练习”,我正在创建一个 Rails 引擎来将所有 API 逻辑/路由/序列化器/规范等与我们的主应用程序分开。我真的只是想要一个尝试引擎的借口......

    我才刚刚开始,但我已经看到了一些明显的优点和缺点,而不是仅仅为我的控制器和序列化程序使用单独的命名空间。

    优点包括独立的依赖项(因为它本质上是一个 gem)、单独的测试、良好的路由(在主应用程序的路由中安装路由)以及为所涉及的所有内容内置命名空间。

    到目前为止,我遇到的缺点是重复。截至目前,我的规格需要工厂,但我还没有找到一种理智的方式来使用父应用程序中的工厂。现在,我只是在引擎中重新创建我需要的工厂。我确定有更好的方法,只是我还没有想出来。

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2013-10-22
      • 2020-01-05
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多