弃用警告: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
实例本身(在我的例子中,我使用一个作为我的演示者的视图上下文 类 在他们的测试中)。
我将应用程序从 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
实例本身(在我的例子中,我使用一个作为我的演示者的视图上下文 类 在他们的测试中)。