弃用警告:ActionView::Base 实例应使用查找上下文、分配和控制器构造

DEPRECATION WARNING: ActionView::Base instances should be constructed with a lookup context, assignments, and a controller

我将应用程序从 rails 5.2 迁移到 rails 6。只剩下一件事要做,但我不知道怎么做。

我有这个折旧警告:

DEPRECATION WARNING: ActionView::Base instances should be constructed with a lookup context, assignments, and a controller. (called from new at /Users/xxx/xxxx/app/models/stock.rb:42)

来自此代码:

view = ActionView::Base.with_empty_template_cache.new(
         ActionController::Base.view_paths, 
         categories: categories, 
         periods: periods
       )

result = view.render formats: [:xlsx], 
                     handlers: [:axlsx], 
                     template: 'admin/reports/logistics/stocks_by_age'

我不知道如何修复它。我去看了源代码中的折旧,但并没有帮助我弄清楚我应该做什么,我也没有找到任何关于这个的文档'lookup'。

拜托,有人可以帮助我了解这种折旧吗?

您似乎正在尝试在请求之外呈现视图。 Rails 过去添加了一项功能,简化了这一点。现在你唯一需要做的就是用你的参数调用 ApplicationController.render 。在您的情况下,它应该看起来像这样:

ApplicationController.render(
  template: 'admin/reports/logistics/stocks_by_age',
  locals: { categories: categories, periods: periods } # maybe assigns: { ... }
  handlers: [:axlsx],
  formats: [:xlsx]
)

如果您有物流控制器,以下代码也应该有效:

Admin::Reports::LogisticsController.render(:stocks_by_age, ...other params same as above..., handlers: [:axlsx], formats: [:xlsx])

有关操作方法的更好说明,请参阅以下文章。 https://blog.bigbinary.com/2016/01/08/rendering-views-outside-of-controllers-in-rails-5.html

出现此弃用警告是因为您将 ActionController::Base.view_paths 作为第一个参数传递给 ActionView::Base.new。这曾经没问题,但现在需要 ActionView::LookupContext 的实例。如果您使用 ActionView::Base.new 的第一个参数查看 most recent version of ActionView::Base#initialize you'll see that where the message appears it calls ActionView::Base.build_lookup_context。您可以通过传递 ActionView::LookupContext.new(ActionController::Base.view_paths)ActionView::Base.build_lookup_context(ActionController::Base.view_paths) 轻松消除此警告,因为无论如何它最终都会使用它。

虽然 ApplicationController.render 有助于在请求之外呈现视图,但有时您需要一个 ActionView::Base 实例本身(在我的例子中,我使用一个作为我的演示者的视图上下文 类 在他们的测试中)。