Rails - 预编译资产上的路由错误
Rails - RoutingError on precompiled asset
我还在学习 Rails 如果这个问题听起来很业余,我很抱歉。我正在 运行ning Rails Ubuntu VM,Passenger + Nginx。我已经 运行 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
在 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 应该会自动找到散列资产,尽管要求提供原始名称?还是需要重新编译等
提前致谢!
这是因为与生产相比,开发中的工作方式不同。
需要注意的几点:-
- 没有 CSS 或 JS 文件将通过资产管道提供给您的应用程序,除非它们包含在 或 中列出的其他文件中
config.precompile
指示。所有 CSS 和 JS 文件默认只有 application.css
和 application.js
可用。
- app/assets 文件夹中除 Javascript 文件或 CSS 文件之外的每个文件都将被 Rails[= 复制46=] 编译资产时进入
public/assets
文件夹。所以如果你想添加一些网络字体,你可以创建一个 app/assets/fonts/ 文件夹并将你的字体放在那里,然后当你编译你的资产时,这些将被复制到 public/assets/fonts
文件夹。请注意,引用这些字体的 app/assets/stylesheets/fonts.css.scss
文件将 不会 被复制,除非您将其添加到 config.assets.precompile
指令或从 application.css
中要求它]
- for
config.assets.compile
...如果设置为"true"(在开发中默认设置)那么Rails将尝试通过首先在 public/assets
目录中查找来找到 Javascript 或 CSS 文件,如果找不到它,将在您的 app/assets
文件夹中寻找文件.如果它在 app/assets
中找到它,它将继续并即时编译,然后提供该资产。
这个问题是你没有注意到它在开发中发生,然后你提交所有内容并推送到生产和 BOOM,一切都被破坏了 500 个错误,因为 生产 config.assets.compile
设置为 "false"。这可以防止应用程序 "falling back" 尝试直接加载文件而不是使用资产管道。
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
为什么不在每个环境中都将此设置为 "true"?好吧,因为它很慢。而且您不希望生产缓慢
- 运行
RAILS_ENV=production rake assets:clean assets:precompile
- 检查 public/assets 目录并验证资产是否已编译..如果它不为空...这意味着资产管道正在工作但路径不是 correct.use asset_helpers 以设置css 个文件中的资产路径。
我发现了错误。它实际上与资产管道无关!这是一个缓存问题。在 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
修复了错误。
我还在学习 Rails 如果这个问题听起来很业余,我很抱歉。我正在 运行ning Rails Ubuntu VM,Passenger + Nginx。我已经 运行 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
在 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 应该会自动找到散列资产,尽管要求提供原始名称?还是需要重新编译等
提前致谢!
这是因为与生产相比,开发中的工作方式不同。 需要注意的几点:-
- 没有 CSS 或 JS 文件将通过资产管道提供给您的应用程序,除非它们包含在 或 中列出的其他文件中
config.precompile
指示。所有 CSS 和 JS 文件默认只有application.css
和application.js
可用。 - app/assets 文件夹中除 Javascript 文件或 CSS 文件之外的每个文件都将被 Rails[= 复制46=] 编译资产时进入
public/assets
文件夹。所以如果你想添加一些网络字体,你可以创建一个 app/assets/fonts/ 文件夹并将你的字体放在那里,然后当你编译你的资产时,这些将被复制到public/assets/fonts
文件夹。请注意,引用这些字体的app/assets/stylesheets/fonts.css.scss
文件将 不会 被复制,除非您将其添加到config.assets.precompile
指令或从application.css
中要求它] - for
config.assets.compile
...如果设置为"true"(在开发中默认设置)那么Rails将尝试通过首先在public/assets
目录中查找来找到 Javascript 或 CSS 文件,如果找不到它,将在您的app/assets
文件夹中寻找文件.如果它在app/assets
中找到它,它将继续并即时编译,然后提供该资产。
这个问题是你没有注意到它在开发中发生,然后你提交所有内容并推送到生产和 BOOM,一切都被破坏了 500 个错误,因为 生产 config.assets.compile
设置为 "false"。这可以防止应用程序 "falling back" 尝试直接加载文件而不是使用资产管道。
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
为什么不在每个环境中都将此设置为 "true"?好吧,因为它很慢。而且您不希望生产缓慢
- 运行
RAILS_ENV=production rake assets:clean assets:precompile
- 检查 public/assets 目录并验证资产是否已编译..如果它不为空...这意味着资产管道正在工作但路径不是 correct.use asset_helpers 以设置css 个文件中的资产路径。
我发现了错误。它实际上与资产管道无关!这是一个缓存问题。在 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
修复了错误。