ActionView::Template::Error (leagues/lal11.png isn't precompiled):
当添加新联盟但相应的图像尚未预编译时,我的应用程序会发生此类错误。
我理解为什么会这样;资产清单缺少相关路径,因此rails无法确定其摘要。然而,由于简单的丢失图像而杀死整个应用程序是愚蠢的。有没有办法捕捉这个特定的例外?
答案 0 :(得分:4)
在这种情况下责备资产管道似乎是错误的。它是一个可选的东西,可以加快您的应用程序。如果您对可以回退的较慢应用程序感到满意,可以在config / environments / production.rb中轻松配置。
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
I wouldn't recommend doing this though!
虽然有人可能会说这不是应该引发异常错误的情况......事实上你是在拉一个不存在的图像。
因此,您的代码需要处理错误。 IMO在面向对象的代码中更好地大规模而不是巧妙地失败。此失败会创建一个可用于修复代码的错误消息。
我建议通过可以处理错误的帮助程序进行路由。像这样的东西是answer
的变体 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
这将在这一情况下恢复并渲染您的默认图像。
答案 1 :(得分:0)
我完全同意你的意见,为丢失图像引发错误......我认为资产管道是铁轨中最糟糕的代码!
我对如何解决这个问题有一些想法:
您可以启用实时编译config.assets.compile = true
您可以在正在使用的帮助程序中捕获该错误(image_tag
或其他)并渲染默认图像。
如果错误不适合您的应用,则可以在控制器中使用rescue_from
。