我最近将我的应用程序部署到了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拉出。
这是我的问题 - 我现在不知道如何正确指向网址。
有没有其他人找到解决方案?
谢谢。
答案 0 :(得分:3)
您基本上遇到了使用Rails的资产pipleline预编译功能的一个陷阱,即您的图像&其他媒体将被给予哈希;并且这些资产的任何参考都必须是动态的以适应
您遇到的问题是,在预编译资产时,.css文件中的静态链接仅指向url(/assets/image.png)
。但是,您真正需要的是使用asset_path
或asset_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自动为我做这件事。
再次感谢大家对此的支持:)