为什么我不能从 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
我还尝试将我的方法放在另一个模块中,然后 include
ing、prepend
ing 和 append
ing 到 ActionView::Helpers::AssetUrlHelper
和 ActionView::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
我正在努力将应用程序升级到 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
我还尝试将我的方法放在另一个模块中,然后 include
ing、prepend
ing 和 append
ing 到 ActionView::Helpers::AssetUrlHelper
和 ActionView::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