已上传Heroku资源,但不会更新图片的网址

时间:2013-10-21 02:55:50

标签: jquery ruby-on-rails image heroku

我最近将我的应用程序部署到了heroku,除了jquery-raty中定义的图像之外,一切工作正常。基本上这个宝石可以让你轻松实现评级系统(视觉上)。

当我推送到heroku时,资源被预编译,我可以看到我指定使用jquery-raty的图像被成功编译并且名称被更改(即,image.png变为image-f96e0d1182b422c912116f08ac8f7d78.png)。一切都很好 - 但我发现当部署到heroku时,这个新名称没有反映出来。也就是说,图片正在尝试从https://myapp.herokuapp.com/assets/image.png而不是https://myapp.herokuapp.com/assets/image-f96e0d1182b422c912116f08ac8f7d78.png拉出。

这是我的问题 - 我现在不知道如何正确指向网址。

有没有其他人找到解决方案?

谢谢。

3 个答案:

答案 0 :(得分:3)

您基本上遇到了使用Rails的资产pipleline预编译功能的一个陷阱,即您的图像&其他媒体将被给予哈希;并且这些资产的任何参考都必须是动态的以适应

您遇到的问题是,在预编译资产时,.css文件中的静态链接仅指向url(/assets/image.png)。但是,您真正需要的是使用asset_pathasset_url帮助程序动态呈现该链接

解决方案为SCSS

我们遇到了这个问题(我们使用asset sync gem),并找到解决问题的最佳方法是让SCSS动态呈现您的资产路径。以下是我们的一些代码:

#app/assets/stylesheets/application.css.scss (yes, you should change it)
@import 'layout/fonts';

#app/assets/stylesheets/layout/fonnts.css.scss
@font-face {
    font-family: 'akagi';
    src: asset_url('fonts/akagi-th-webfont.eot');
    src: asset_url('fonts/akagi-th-webfont.eot?#iefix') format('embedded-opentype'),
         asset_url('fonts/akagi-th-webfont.woff') format('woff'),
         asset_url('fonts/akagi-th-webfont.ttf') format('truetype'),
         asset_url('fonts/akagi-th-webfont.svg#akagithin') format('svg');
    font-weight: 300;
    font-style: normal;
}

了解我们如何使用asset_url

这使rake能够在编译时定义资产的 new 路径,而不是旧路径;这意味着当您运行rake assets:precompile时,您将获得所有正确的引用。

每当我们编译资产时,我都会建议使用这个预编译过程:

rake assets:precompile RAILS_ENV=production

...当你上传到Heroku时:

heroku run rake assets:precompile --app [your app]

答案 1 :(得分:2)

如果您使用的是Rails 4

在没有指纹的情况下引用静态资产。因此资产最终在404。 从Rails 4开始,摘要选项默认设置为false。 https://github.com/rails/rails/issues/11482

虽然不是首选解决方案,但您可以尝试在public文件夹中同时使用已消化和未消化的资源。

这可能会为您完成任务 - https://github.com/alexspeller/non-stupid-digest-assets

您可能也希望看到这一点 https://github.com/rails/sprockets-rails/issues/49

答案 2 :(得分:2)

感谢@Rich Peck,@ swap.nil和其他人回答我的问题。在昨天弄乱了几个小时之后,我决定做我应该做的事情,首先阅读本页The Assets Pipeline

...基本上@Rich Peck在使用动态呈现的URL方面提到的是关键。为此,我只需将.js.coffee文件更改为.js.coffee.erb文件,并使用"<%= asset_path('my-image.png') %>"为文件呈现相应的URL。一旦我这样做,一切正常。我不需要做任何关于手动预编译资产的事情 - 我仍然让heroku自动为我做这件事。

再次感谢大家对此的支持:)