对于缺少的资产,Rails忽略ActionView :: Template :: Error

时间:2012-10-13 08:48:02

标签: ruby-on-rails asset-pipeline

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

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

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

2 个答案:

答案 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