【问题标题】:Rails - RoutingError on precompiled assetRails - 预编译资产上的 RoutingError
【发布时间】:2015-04-03 11:28:10
【问题描述】:

我还在学习 Rails,如果这个问题听起来很业余,我很抱歉。我在 Ubuntu VM、Passenger + Nginx 上运行 Rails。我已经运行了asset:precompile,它似乎成功且没有错误。但是,当我在生产环境中启动服务器并尝试访问该页面时,我得到了

[INFO ] GET     "/images/pages/home/index/features/healthy_big.jpg"  for 202.189.127.97  at 2015-04-03 19:00:06 +0800
[FATAL]
ActionController::RoutingError (No route matches [GET] "/images/pages/home/index/features/healthy_big.jpg"):

文件被编译到我的public/assets/pages/home/index/features/目录下的healthy_big-5fb165905a0d689780f44dbb9b178f00.jpg

奇怪的是,其他一些也经过哈希处理的图像可以完美加载而没有问题。例如文件landing_1.jpg,在public/assets/pages/home/index 中变成了landing_1-cd89a8ce37aab0ebffb9529b7ec430ae.jpg,完美地显示出来。我尝试展示这两张图片的方式都是通过image_tag

= image_tag("pages/home/index/features/healthy_big.jpg", alt: t('views.templates.home.index.img_alts.healthy'))

= image_tag('pages/home/index/landing_1.jpg')

问题的原因可能是什么?我猜 Rails 应该会自动找到散列资产,尽管请求了原始名称?还是我需要重新编译等。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails asset-pipeline rails-routing sprockets


    【解决方案1】:

    这是因为与生产相比,开发中的工作方式不同。 有几点需要注意:-

    1. 除非它们包含在config.precompile 指令中列出的其他文件中,否则您的应用将无法通过资产管道使用任何 CSS 或 JS 文件。所有 CSS 和 JS 文件默认只有 application.cssapplication.js 可用。
    2. 当您编译资产时,Rails 会将 app/assets 文件夹中的每个不是 Javascript 文件或 CSS 文件的文件复制到 public/assets 文件夹中。因此,如果你想添加一些网络字体,你可以创建一个 app/assets/fonts/ 文件夹并将你的字体放在那里,然后当你编译你的资产时,这些将被复制到 public/assets/fonts 文件夹。请注意,引用这些字体的 app/assets/stylesheets/fonts.css.scss 文件将被复制,除非您将其添加到 config.assets.precompile 指令或从您的 application.css 中要求它
    3. 对于config.assets.compile...如果设置为“true”(在开发中默认设置),那么 Rails 将尝试通过首先查找 Javascript 或 CSS 文件public/assets 目录,如果找不到它,将在您的 app/assets 文件夹中寻找文件。如果它在 app/assets 中找到它,它将继续运行并即时编译,然后提供此资产。

    问题在于您没有注意到它在开发中发生,然后您提交所有内容并推送到生产和 BOOM,由于 生产 设置了 config.assets.compile,一切都因 500 错误而中断为“假”。这可以防止应用“回退”并尝试直接加载文件而不是使用资产管道。

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

    为什么不在每个环境中都将其设置为“true”?好吧,因为它很慢。而且您不希望生产缓慢

    1. 运行RAILS_ENV=production rake assets:clean assets:precompile
    2. 检查 public/assets 目录并验证资产是否已编译..如果它不为空...这意味着资产管道正在工作但路径不正确。使用 asset_helpers 设置 css 文件中资产的路径。

    【讨论】:

    • 感谢您的详细解释。但是我不认为这导致了我的问题。事实上,即使在我设置 config.assets.compile = true 之后,同样的错误仍然存​​在,即使文件healthy_big.jpg 肯定存在于app/assets 中。一定是别的什么地方出了问题。奇怪,因为它在开发中运行良好。会不会是和passenger/nginx有关的东西?
    【解决方案2】:

    我发现了错误。它实际上与资产管道无关!这是一个缓存问题。在desktop.html.haml 文件中,我使用了

    - local_cache [:tour, :sub_section_1,
        :locale_2015_02_28_001,
        :assets_2015_02_28_001] do
    

    用于包含图像的 div。但是我实际上在 2 月 28 日之后更改了资产图像。因此,尝试从中间服务器的缓存中获取资产(请注意,202.189.127.97 不是我的生产服务器,而是我使用我的开发机器连接到的东西)。

    将缓存指令更改为

    - local_cache [:tour, :sub_section_1,
        :locale_2015_02_28_001,
        :assets_2015_04_03_001] do
    

    修正了错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多