ruby-on-rails 衰退警告:ActionView::应使用查找上下文、赋值和控制器构造基示例

igetnqfo  于 2022-12-24  发布在  Ruby
关注(0)|答案(3)|浏览(176)

我把一个应用程序从rail5.2迁移到rail6,只剩下一件事要做,但我不知道怎么做。
我有这样的折旧警告:
衰退警告:ActionView::应使用查找上下文、分配和控制器构造基本示例。(从位于/Users/xxx/xxxx/app/models/stock. rb:42的new调用)
从这个代码:

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'

我不知道怎么修复,我去查看了源代码中的折旧,但它并没有帮助我弄清楚我应该怎么做,而且我也没有真正找到任何关于这个"查找"的文档。
请问,谁能帮我理解一下这个折旧?

gdrx4gfi

gdrx4gfi1#

看起来你试图在请求之外呈现视图。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

afdcj2ne

afdcj2ne2#

出现此弃用警告是因为您将ActionController::Base.view_paths作为第一个参数传递给ActionView::Base.new。这在以前是可以的,但现在需要ActionView::LookupContext的示例。如果查看ActionView::Base#initialize的最新版本,您会看到消息出现的地方,它使用ActionView::Base.new的第一个参数调用ActionView::Base.build_lookup_context。您可以通过传递ActionView::LookupContext.new(ActionController::Base.view_paths)ActionView::Base.build_lookup_context(ActionController::Base.view_paths)轻松地消除此警告,因为无论如何它最终都会使用ActionView::LookupContext.new(ActionController::Base.view_paths)ActionView::Base.build_lookup_context(ActionController::Base.view_paths)
虽然ApplicationController.render有助于在请求之外呈现视图,但有时您需要ActionView::Base的示例本身(在我的例子中,我使用一个示例作为我的演示者类在其测试中的视图上下文)。

ssm49v7z

ssm49v7z3#

使用ApplicationController.render不适合我,所以我构建了自己的自定义可重用解决方案。

# lib/custom_action_view.rb

module CustomActionView
  extend self

  delegate :view_paths, to: "ApplicationController"

  def build
    ActionViewExtended.with_view_paths(custom_view_paths)
  end

  # This method shouldn't be necessary but in some cases overriding 
  # +compiled_method_container+ (as the deprecation message suggests)
  # is not enough
  def custom_view_paths
    return view_paths if Rails.env.production?

    view_paths.each(&:clear_cache)
  end

  class ActionViewExtended < ActionView::Base
    include Rails.application.routes.url_helpers

    def compiled_method_container
      self.class.superclass # => ActionView::Base
    end

    def default_url_options
      Rails.application.config.url_options
    end
  end
end

那么如果你有类似

view = ActionView::Base.new
view.extend MyParticularHelper
view.render(options)

现在可以是

view = CustomActionView.build
view.extend MyParticularHelper
view.render(options)

它还将删除弃用消息。

相关问题