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

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

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

4

2 回答 2

5

在这种情况下指责资产管道似乎是错误的。它是一个可选的东西,可以加快您的应用程序。如果您对将回退的较慢应用程序感到满意,则可以在 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

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

于 2013-07-30T17:41:57.160 回答
0

我完全同意你的看法,因为丢失图像会引发错误......我认为资产管道是 Rails 中最糟糕的一段代码!

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

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

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

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

于 2012-10-13T14:34:32.957 回答