为什么我不能从 ActionView 覆盖#asset_path?

Why can't I override #asset_path from ActionView?

我正在努力将应用程序升级到 Rails 5,如果 url 为零,#asset_path 现在会引发。我正在尝试使用像 Rails 4 这样工作的版本对该方法进行猴子修补,以便我可以通过测试。

我在这上面花了好几个小时,我快疯了。出于某种原因,无论我做什么,我都无法修补模块。我认为这个初始化程序可以工作:

module ActionView
  module Helpers
    module AssetUrlHelper
      alias asset_path_raise_on_nil asset_path

      def asset_path(source, options = {})
        return '' if source.nil?
        asset_path_raise_on_nil(source, options)
      end
    end
  end
end

我还尝试将我的方法放在另一个模块中,然后 includeing、prepending 和 appending 到 ActionView::Helpers::AssetUrlHelperActionView::Helpers::AssetTagHelper .

无论我做什么,我的方法都无法执行。我可以更改方法的唯一方法是 bundle open actionview 并更改实际方法。

我发现这是因为 #asset_path 只是一个别名。我需要覆盖别名指向的方法:

module ActionView
  module Helpers
    module AssetTagHelper
      alias_method :path_to_asset_raise_on_nil, :path_to_asset

      def path_to_asset(source, options = {})
        return '' if source.nil?
        path_to_asset_raise_on_nil(source, options)
      end
    end
  end
end