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

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

当添加新联赛但相应的图片未预编译时,我的应用程序会出现此类错误。
我理解为什么会发生这种情况; 资产清单缺少相关路径,因此Rails无法确定其摘要。然而,因为简单的缺失图像而杀死整个应用程序是愚蠢的。有没有办法捕捉这个特定的异常?
2个回答

5
责备资产管道在这种情况下似乎是不正确的。它是一个可选的东西,用来加快应用程序的速度。如果您满意速度较慢的应用程序会回退,则可以轻松配置 config/environments/production.rb。
 # Don't fallback to assets pipeline if a precompiled asset is missed
 config.assets.compile = false

不过我并不推荐这样做!

虽然有人可能会认为这不是应该引发异常错误的情况...但事实上,你正在获取一个不存在的图像。

所以你的代码需要处理这个错误。在面向对象的代码中,我认为失败大而化之比聪明更好。这种失败会创建一个很好的失败消息,可以用来修复代码。

我建议通过一个能够处理错误的帮助程序进行路由。类似于这个答案的变体。

 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

这将会在这个特定情况下恢复并呈现您的默认图片。

0

我非常同意你的看法,对于缺少图像而引发错误……我认为资产管道是Rails中最糟糕的代码!

我有一些想法可以解决这个问题:

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

您可以在使用 helper(image_tag或其他)时捕获该错误并呈现默认图像。

如果错误不是全局的,您可以在控制器中使用 rescue_from


我选择了第二个选项,在帮助方法中进行了救援,然后调用了image_tag。真是一件麻烦的事情;希望Rails 4能更优雅地处理这个问题。 - noodl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接