Rails - 预编译资产上的RoutingError

时间:2015-04-03 11:28:10

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

我还在学习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"):

该文件已编译到healthy_big-5fb165905a0d689780f44dbb9b178f00.jpg目录中的public/assets/pages/home/index/features/

奇怪的是,其他一些也经过哈希处理的图像完全没有问题地加载。例如,在landing_1.jpg内变为landing_1-cd89a8ce37aab0ebffb9529b7ec430ae.jpg的文件public/assets/pages/home/index完全显示出来。我尝试显示这两张图片的方式都是通过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应该自动找到散列资产,虽然请求原始名称?或者我是否需要重新编译等。

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

  1. 除非config.precompile指令中列出的其他文件 OR 中包含CSS或JS文件,否则不会通过资产管道向您的应用提供这些文件。默认情况下,只有application.cssapplication.js可用于所有CSS和JS文件。
  2. 编译资产时, Rails 中的每个不是Javascript文件或CSS文件的文件都会被 Rails 复制到public/assets文件夹中。因此,如果要添加一些Web字体,可以创建app / assets / fonts /文件夹并将字体放在那里,然后在编译资源时将这些字体复制到public/assets/fonts文件夹。请注意,引用这些字体的app/assets/stylesheets/fonts.css.scss文件将被复制,除非您将其添加到config.assets.precompile指令或从application.css
  3. for config.assets.compile ...如果设置为" true" (默认情况下在开发中)然后 Rails 将首先查看public/assets目录并尝试查找Javascript或CSS文件,如果找不到它,将会寻找你的app/assets文件夹寻找文件。如果它在app/assets中找到它,它将继续进行动态编译,然后提供此资产。
  4. 问题在于你没有注意到它在开发过程中发生,然后你提交了所有内容并推送到生产和BOOM,因为生产具有{{ 1}}设置为" false" 。这可以防止应用程序退回"并尝试直接加载文件,而不是使用资产管道。

    config.assets.compile

    为什么不把这个设置为" true"在每个环境?好吧,因为它是sloooooow。而且你不希望生产缓慢

    1. 运行# Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false
    2. 检查public / assets目录并验证资产是否已编译..如果它不为空...这意味着资产管道正在运行但路径不正确。使用asset_helpers设置css文件中资产的路径

答案 1 :(得分:0)

我发现了错误。它实际上与资产管道无关!这是一个缓存问题。在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

修正了错误。