子目录和 Rails 资产管道

Subdirectories and the Rails assets pipeline

我的项目中有这样的目录结构:

- assets
-- images
--- game
--- avatars

我在像这样的代码中引用头像中的图像:

image_tag('avatar.png')

在开发中有效,在生产中出现错误。

我在application.rb

中有这个代码
Dir.glob("#{Rails.root}/app/assets/images/**/").each do |path|
  config.assets.paths << path
end

当我在开发中编译我的资产时,我看到它们是在 public 的子目录下创建的。所以像这样:

- public
-- assets
--- game
--- avatars

但是在日志中我看到了这个:

http://demo1e97.lvh.me:3000/assets/avatar-edc80241a6bae07d6ed70cdffef15753.png

所以它没有使用那里的子目录。

解决此问题以使其在开发和生产中都能正常工作的最佳方法是什么? public是把所有的图片都写到一个目录下,还是在引用图片的时候把子文件夹包含进去?

在引用图像时,您应该始终包含相对路径(在 assets/images 下),如下所示:

<%= image_tag("avatars/avatar.png") %>

这将解析位于 app/assets/images/avatars/avatar.png 的文件,并确保它在所有环境中都能正常工作。然后,您可以从 application.rb:

中完全删除此代码
Dir.glob("#{Rails.root}/app/assets/images/**/").each do |path|
  config.assets.paths << path
end

点数:1 只要您将子目录添加到图像、样式表、javascript,您就不需要将它们添加到资产路径。所有子目录变为/assets。

因此您当前的帮助将在此处生成:

<%= image_tag("game/avatar.png") %> 
=> http://demo1e97.lvh.me:3000/assets/avatar.png

这是惯例,因此您无需将它们放在 public 文件夹中。当您部署到生产环境时,您的资产预编译过程将通过维护资产清单将其带到 public 文件夹。