我的问题是关于使用 rails 资产管道时动作视图 gem 的标准行为。
只要有未预编译的图像,它就会引发异常,并且应用程序执行停止,因此用户只会看到标准的空白页面说:“......出了点问题”。
像丢失图像这样微不足道的东西(可能是一个图标,也许只是一个拼写错误的名字......)不应该是一个炫耀的东西。应该吗?!
我们希望将这种激进的行为更改为更温和的版本:让应用程序继续工作,但当然会通知我们丢失的图像。
问题:
除了猴子修补动作视图gem中包含的辅助方法的相关部分之外,还有其他方法吗?
有没有我们可以修改的配置,所以不需要这个补丁?
在 gem 更新的情况下,拥有这种猴子补丁被认为是维护的噩梦,不是吗?
这是我们的实际补丁:名为:“assetpipe_easy_errors.rb”,驻留在 中config/initializers
,相关方法为“ digest_for
”
Sprockets::Helpers::RailsHelper::AssetPaths.class_eval do
attr_accessor :asset_environment, :asset_prefix, :asset_digests, :compile_assets, :digest_assets
class AssetNotPrecompiledError < StandardError; end
def asset_for(source, ext)
source = source.to_s
return nil if is_uri?(source)
source = rewrite_extension(source, nil, ext)
asset_environment[source]
rescue Sprockets::FileOutsidePaths
nil
end
def digest_for(logical_path)
if digest_assets && asset_digests && (digest = asset_digests[logical_path])
return digest
end
if compile_assets
if digest_assets && asset = asset_environment[logical_path]
return asset.digest_path
end
return logical_path
else
#original code: raise AssetNotPrecompiledError.new("#{logical_path} isn't precompiled")
### own Patch: these next four lines:
Rails.logger.info(" arrg!! an image is missing ")
### example: FeedbackMailer.generic_system_message(subject,bodytext).deliver
FeedbackMailer.generic_system_message("asset error",logical_path).deliver
return logical_path
end
end
def rewrite_asset_path(source, dir, options = {})
if source[0] == ?/
source
else
if digest_assets && options[:digest] != false
source = digest_for(source)
end
source = File.join(dir, source)
source = "/#{source}" unless source =~ /^\//
source
end
end
def rewrite_extension(source, dir, ext)
source_ext = File.extname(source)
if ext && source_ext != ".#{ext}"
if !source_ext.empty? && (asset = asset_environment[source]) &&
asset.pathname.to_s =~ /#{source}\Z/
source
else
"#{source}.#{ext}"
end
else
source
end
end
end
任何想法都受到高度赞赏