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 系统以开始获取这些文件的可靠踪迹。我在调查中尝试过的一些事情:
- 检查了控制器对象。我看到它没有经历
formats
或 _prefixes
的变化
- 完成了导致设置响应的流程。在好的情况下,jbuilder 在
render_templates
期间被调用,但在添加 gem 之后,它永远不会被调用
- 试图在
lookup_context
上直接调用方法,同时进行窥探,但未得出结论。
事实证明,有问题的 gem (AccessGranted) 在模块加载时调用 ActionController::API
上的 class_eval
,这是在 Jbuilder 的轨枕调用之前,因此 Jbuilder 有尚未执行 ApiController
的补丁。因此,ActionController::API
,它是我的控制器 class 的父级,在没有 ActionView::Rendering
的情况下加载。
据我所知,此加载顺序在 Rails 中不规范,因此我认为这是 AccessGranted 的问题。因此,我向 AccessControl 提交了一个 PR 以使其符合 Rail Tie hook 机制。
在一个 rails 5.1 项目中,我有一个像 Api::V1::ResourcesController
的控制器和一个像 #create
的方法;我最终调用了 render status: 201, formats: :json
。如我所料,这导致加载位于 app/views/api/v1/resources/create.json.jbuilder
.
我最近将 AccessGranted
gem 添加到我的项目中,在这样做之后(没有更改代码),我发现我对 render
的调用仍在产生所需的结果201
状态,但始终生成 </code>(单个 space 字符)作为正文。此外,<code>pry
的一些检查似乎表明 lookup_context
没有找到该文件,但是我不能说这是为什么,因为我真的不知道如何在这里追踪因果层次结构.
更新:
我发现一旦包含 AccessGranted,我的控制器 class 的祖先就不再包含 ActionView::Rendering
。它按预期包含 AccessGranted::Rails::ControllerMethods
,但对祖先没有其他更改。
这里让我感到不安的是 AccessGranted 是一个很小的 gem,我已经能够在大约二十分钟内完整地审查它,没有任何迹象表明它为什么会搞砸rails。我什至可以在新的 gem 中寻找一些特定的东西来判断它可能会改变什么,只是将它包含在 gem 文件中?
理想情况下,我想知道这里到底发生了什么,但即使没有,我也很难导航动态 ruby 系统以开始获取这些文件的可靠踪迹。我在调查中尝试过的一些事情:
- 检查了控制器对象。我看到它没有经历
formats
或_prefixes
的变化
- 完成了导致设置响应的流程。在好的情况下,jbuilder 在
render_templates
期间被调用,但在添加 gem 之后,它永远不会被调用 - 试图在
lookup_context
上直接调用方法,同时进行窥探,但未得出结论。
事实证明,有问题的 gem (AccessGranted) 在模块加载时调用 ActionController::API
上的 class_eval
,这是在 Jbuilder 的轨枕调用之前,因此 Jbuilder 有尚未执行 ApiController
的补丁。因此,ActionController::API
,它是我的控制器 class 的父级,在没有 ActionView::Rendering
的情况下加载。
据我所知,此加载顺序在 Rails 中不规范,因此我认为这是 AccessGranted 的问题。因此,我向 AccessControl 提交了一个 PR 以使其符合 Rail Tie hook 机制。