我正在开发rails 4中的测试应用程序,并希望在heroku上托管它。问题是我似乎无法显示资产,而这在我的本地系统上工作正常。
请参阅以下链接:http://depot-test.herokuapp.com/>所有资产在文件名后面都有一些随机ID。
首先,我检查了资产在回购中实际可用,它们是。
然后我用bash检查了资产是否在heroku上可用:
$ heroku run bash
$ ls -la app/assets/images
total 60
drwx------ 2 u41129 41129 4096 2013-09-08 17:27 .
drwx------ 5 u41129 41129 4096 2013-09-08 17:27 ..
-rw------- 1 u41129 41129 15093 2013-09-08 17:27 cs.jpg
-rw------- 1 u41129 41129 0 2013-09-08 17:27 .keep
-rw------- 1 u41129 41129 1040 2013-09-08 17:27 logo.png
-rw------- 1 u41129 41129 1787 2013-09-08 17:27 rails.png
-rw------- 1 u41129 41129 9882 2013-09-08 17:27 rtp.jpg
-rw------- 1 u41129 41129 12549 2013-09-08 17:27 ruby.jpg
正如你所看到的那样。
然后我尝试直接加载图片,http://depot-test.herokuapp.com/assets/logo.png> 404
我想知道是什么导致了id的添加。
哈希显然是由rails创建的,但资源仍未加载。我正在使用标准的rails helpers,如:
IMAGE_TAG
查看我的布局:
<!DOCTYPE html>
<html>
<head>
<title>Pragprog Books Online Store</title>
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>
</head>
<body class="<%= controller.controller_name %>">
<div id="banner">
<%= image_tag("logo.png") %>
<%= @page_title || "Pragmatic Bookshelf" %>
</div>
<div id="columns">
<div id="side">
<% if @cart %>
<%= hidden_div_if(@cart.line_items.empty?, id: 'cart') do %>
<%= render @cart %>
<% end %>
<% end %>
<ul>
<li><a href="http://www....">Home</a></li>
<li><a href="http://www..../faq">Questions</a></li>
<li><a href="http://www..../news">News</a></li>
<li><a href="http://www..../contact">Contact</a></li>
</ul>
<!-- Exersise of showing current time -->
<span><%= Time.now.strftime("%I:%M:%S %z") %></span>
<!-- End showing time -->
</div>
<div id="main">
<%= yield %>
</div>
</div>
</body>
</html>
答案 0 :(得分:3)
在heroku rails 4启动指南https://devcenter.heroku.com/articles/rails4#logging-and-assets中,它声明你需要一个叫做的宝石:
gem 'rails_12factor', group: :production
如果没有这个宝石,资产管道将无效。这解决了我的问题。
答案 1 :(得分:1)
您看到的文件名后面的随机ID是MD5指纹,它是在生产模式下添加的。这是一种缓存破坏技术。因此,在生产模式下,您无法仅通过文件名实际引用资产。因此,无论您何时尝试引用资产,至少需要使用asset_path
。或者,如果您有图像,那么image_tag
将为您做正确的事。
这里有一个更好的解释为什么MD5指纹是一件好事:http://guides.rubyonrails.org/asset_pipeline.html#what-is-fingerprinting-and-why-should-i-care-questionmark
以下是您必须使用的可用帮助信息,以便在资产路径中包含正确的MD5指纹:http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets