ActionView::Template::Error (leagues/lal11.png isn't precompiled):
当添加新联赛但未预编译相应图像时,我的应用程序中会发生此类错误。
我明白为什么会这样;资产清单缺少相关路径,因此 rails 无法确定它的摘要。然而,因为一个简单的丢失图像而杀死整个应用程序是愚蠢的。有没有办法捕捉这个特定的异常?
ActionView::Template::Error (leagues/lal11.png isn't precompiled):
当添加新联赛但未预编译相应图像时,我的应用程序中会发生此类错误。
我明白为什么会这样;资产清单缺少相关路径,因此 rails 无法确定它的摘要。然而,因为一个简单的丢失图像而杀死整个应用程序是愚蠢的。有没有办法捕捉这个特定的异常?
在这种情况下指责资产管道似乎是错误的。它是一个可选的东西,可以加快您的应用程序。如果您对将回退的较慢应用程序感到满意,则可以在 config/environments/production.rb 中轻松配置
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
尽管有人可能会争辩说这不是应该引发异常错误的情况……但事实是您正在提取一个不存在的图像。
因此,您的代码需要处理一个错误。IMO 在面向对象的代码中更好的是大量失败而不是巧妙地失败。此失败会创建一个很好的失败消息,您可以使用它来修复代码。
我建议通过可以处理错误的助手进行路由。像这样的东西是这个答案的变体
def safe_image_tag(source, options = {})
begin
count = 0
source ||= "blank-profile-md.png"
image_tag(source, options)
rescue Sprockets::Helpers::RailsHelper::AssetPaths::AssetNotPrecompiledError
count += 1
source = "blank-profile-md.png"
retry if count < 2
end
end
在这种情况下,这将恢复并呈现您的默认图像。
我完全同意你的看法,因为丢失图像会引发错误......我认为资产管道是 Rails 中最糟糕的一段代码!
我对如何解决这个问题有一些想法:
你可以启用实时编译config.assets.compile = true
您可以在您正在使用的帮助程序(或其他)中捕获该错误image_tag
并呈现默认图像。
rescue_from
如果错误不在您的应用程序中,您可以在控制器中使用。