【问题标题】:how could a new gem in Gemfile (AccessGranted) with no dependencies break ActionView/Jbuilder?没有依赖关系的 Gemfile (AccessGranted) 中的新 gem 怎么会破坏 ActionView/Jbuilder?
【发布时间】:2018-09-28 02:00:06
【问题描述】:

在 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 状态,但总是在产生@ 987654328@(单个空格字符)作为正文。此外,对pry 的一些检查似乎表明lookup_context 没有找到该文件,但是我不能说为什么会这样,因为我真的不知道如何在这里追踪因果层次结构。


更新:

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


这里让我感到不安的是,AccessGranted 是一个小宝石,我已经能够在大约 20 分钟内完整地查看它,但没有任何迹象表明它为什么会与铁轨混在一起。是否有一些我可以在新 gem 中查找的特定内容,以通过将其包含在 gem 文件中来判断它可能会发生什么变化?

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

  • 检查了控制器对象。我看到它没有经历formats_prefixes的变化
  • 浏览了导致设置响应的流程。 jbuilder 在render_templates 期间被调用,在好的情况下,但是在添加 gem 之后,它永远不会被调用
  • 试图在窥探时直接在lookup_context 上调用方法,但未得出结论性结果。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 actionview actioncontroller jbuilder


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2019-09-27
      相关资源
      最近更新 更多