使用 image_tag 从根渲染图像

Rendering images from root with image_tag

我的根 'root/tmp/database/*.JPG' 中有一个文件夹,我想在我的视图中显示 image_tag

我目前的代码是:

<% @images.each do |image| %>
  <%= image_tag image.file, class: "img-responsive"  %>
<% end %>

但是因为 image_tag 使用资产管道,它将图像渲染为:

'/images/tmp/database/xotter-1.jpg'

所以我的问题是,我是否可以使用 image_tag 并将图像呈现为:'/tmp/database/*.JPG'

您网站中提供的所有资源(图片、css、js 等)都需要来自 public 文件夹内的某个位置。但是,public 文件夹可以包含指向其他文件夹的 符号 links,即快捷方式。

因此,例如,如果您想提供来自 #{Rails.root}/tmp/database 的文件,您可以像这样创建一个符号 link:

#from your application folder
cd public
ln -s ../tmp/database database

您现在应该在 public 文件夹中看到 database 文件夹,并且可以 link 使用 url

"/database/xotter-1.jpg"

对应于

处的文件
#{Rails.root}/public/database/xotter-1.jpg

这些说明假设您使用的是 bash 风格的命令行 shell,例如 linux 或 mac os。如果您在 windows 中,您可能需要以不同方式设置快捷方式。

编辑:关于显示文件夹中所有图像的后续问题的答案。

假设您有一个文件夹 #{Rails.root}/public/database,并且您想要在其中找到所有 jpg 文件:您可以通过多种方式来实现。我喜欢 Dir[],与 File.join 一起使用(这是生成占 extra/missing 斜杠的文件路径的安全方法,否则很容易出错)例如

jpg_files = Dir[File.join("public/database", "*.jpg")]
=> ["public/database/foo.jpg", "public/database/bar.jpg"]

请注意,这些路径都是相对于命令的来源 运行 的,在 rails 服务器或控制台的情况下,是 rails 应用程序文件夹。

如果你想 link 这些,你需要相对于 public 文件夹的路径,你可以说

filename.gsub("public","")
=> "/database/foo.jpg"

所以,为了将它们结合在一起,在您的模板中:

<% Dir[File.join("public/database", "*.jpg")).each do |file| %>
  <%= image_tag file.gsub("public",""), class: "img-responsive"  %>
<% end %>

只是为了添加到 Max Williams' 史诗般的答案,如果您用图像填充 public 文件夹(而不是 tmp),您将能够使用 built-in asset_path helpers:

Computes the path to asset in public directory

asset_path "database/xotter-1.jpg" #-> /public/assets/database/xotter-1.jpg"

我明白这意味着您必须使用 assets 子目录,但这是有充分理由的...

--

预编译

就个人而言,我会将图像放入您应用程序的 assets/images 文件夹中。

您将遇到的问题是,您的所有图像都将 "naked" 保留在您的 public 文件夹中,这将使它们处于热 linking 状态,而且阻止它们在资产管道中的正确使用。

如果您在 assets/images/.... 中包含图像,您将在推送到生产环境时获得 precompile 个图像:

rake assets:precompile RAILS_ENV=production

无论如何,预编译都会将所有资产放入 /public 文件夹中...但更重要的是,fingerprints 它们:

public/assets/images/database/xotter-1-[[fingerprint]].jpg

如果您致电 image_tag databsae/xotter-1.jpg,这些图片仍然可用,但这次它们会在正确的位置。


Rails 中的所有路径都取自 public 目录,因此您可以通过使用相对路径直接将 link 引用到 public 目录:

image_tag 'database/xotter-1.jpg

不同之处在于,如果您将图像放入 assets/images,它们将包含在资产管道中,因此无论您 运行 您的应用所在的环境如何,它们都可以访问。