Gemfile (AccessGranted) 中没有依赖项的新 gem 怎么会破坏 ActionView/Jbuilder?

how could a new gem in Gemfile (AccessGranted) with no dependencies break ActionView/Jbuilder?

在一个 rails 5.1 项目中,我有一个像 Api::V1::ResourcesController 的控制器和一个像 #create 的方法;我最终调用了 render status: 201, formats: :json。如我所料,这导致加载位于 app/views/api/v1/resources/create.json.jbuilder.

的 Jbuilder 视图

我最近将 AccessGranted gem 添加到我的项目中,在这样做之后(没有更改代码),我发现我对 render 的调用仍在产生所需的结果201 状态,但始终生成 </code>(单个 space 字符)作为正文。此外,<code>pry 的一些检查似乎表明 lookup_context 没有找到该文件,但是我不能说这是为什么,因为我真的不知道如何在这里追踪因果层次结构.


更新:

我发现一旦包含 AccessGranted,我的控制器 class 的祖先就不再包含 ActionView::Rendering。它按预期包含 AccessGranted::Rails::ControllerMethods,但对祖先没有其他更改。


这里让我感到不安的是 AccessGranted 是一个很小的 ​​gem,我已经能够在大约二十分钟内完整地审查它,没有任何迹象表明它为什么会搞砸rails。我什至可以在新的 gem 中寻找一些特定的东西来判断它可能会改变什么,只是将它包含在 gem 文件中?

理想情况下,我想知道这里到底发生了什么,但即使没有,我也很难导航动态 ruby 系统以开始获取这些文件的可靠踪迹。我在调查中尝试过的一些事情:

事实证明,有问题的 gem (AccessGranted) 在模块加载时调用 ActionController::API 上的 class_eval,这是在 Jbuilder 的轨枕调用之前,因此 Jbuilder 有尚未执行 ApiController 的补丁。因此,ActionController::API,它是我的控制器 class 的父级,在没有 ActionView::Rendering 的情况下加载。

据我所知,此加载顺序在 Rails 中不规范,因此我认为这是 AccessGranted 的问题。因此,我向 AccessControl 提交了一个 PR 以使其符合 Rail Tie hook 机制。