Rails忽略了缺少资产的ActionView :: Template :: Error

ActionView::Template::Error (leagues/lal11.png isn't precompiled): 

这种错误发生在我的应用程序中,当添加新联盟但相应的图像尚未预编译时。

我明白为什么会这样; 资产清单缺少相关路径,因此rails无法确定其摘要。 然而,由于简单的丢失图像而杀死整个应用程序是愚蠢的。 有没有办法捕获这个特定的例外?

我不能同意你的意见,为丢失图像引发错误…我认为资产管道是铁轨中最糟糕的代码!

我对如何解决这个问题有一些想法:

你可以启用实时编译config.assets.compile = true

您可以在正在使用的帮助程序中捕获该错误( image_tag或其他)并呈现默认图像。

如果错误不是你的应用程序,你可以在你的控制器中使用rescue_from

在这种情况下责备资产管道似乎是错误的。 它是一个可选的东西,可以加快您的应用程序。 如果您对可以回退的较慢应用程序感到满意,可以在config / environments / production.rb中轻松配置

  # Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false 

我不建议这样做!

虽然有人可能会争辩说这不是应该引发exception错误的情况……事实上你是在拉一个不存在的图像。

因此,您的代码需要处理错误。 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 

在这种情况下,这将恢复并呈现您的默认图像。