我有两个问题,但我猜他们都会得到同样的答案。
它们都与静态图像显示在开发模式而非生产(heroku)这一事实有关。
案例1:
在我的model.rb
中has_attached_file :avatar, styles: {
thumb: '32x32#',
medium: '512x512#'
},
:default_url => ActionController::Base.helpers.asset_path('/assets/avatar_:style.png') ## <- This line (#1)
案例2:
在我的view.html.haml中,我有内联javascript
:javascript
$('.star').raty({
path: '/assets', ### <- This line (#2)
readOnly: true,
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});
在 CASE 1 中,如果用户没有上传个人资料照片(使用回形针),我会尝试实现默认图片,其中包含两张图片avatar_thumb.png
和avatar_medium.png
在/app/assets/images
在 CASE 2 中,我尝试使用第三方库raty来实施5星评级功能,这需要&#34; 明星&# 34;图片。我已在/app/assets/images
中放置了此库附带的三张图片。
问题:在这两种情况下,图像都是在开发模式下看到的,但在部署到Heroku时却看不到。我该如何解决这个问题。
P.S。:我绝对不熟悉rails,任何帮助都会受到赞赏。
答案 0 :(得分:1)
由于您是新手,请让我描述一下它是如何运作的:
-
<强>资产强>
部署Rails应用程序时,assets
将成为asset pipeline
的一部分。在开发过程中,您的资产文件存储在app/assets/...
当您使用asset path helpers
时,Rails会为您调用以下路径:
app/assets/...
vendor/assets/...
public/...
您遇到的问题是开发中,app/assets
中存在您的所有资源,您可以随意调用您想要的所有文件
-
<强>生产强>
当您在production
模式下运行应用时,事情变得有点棘手
首先,您不能再依赖app/assets
中的资产了 - 一般来说生产模式(并非总是如此,但肯定是在Heroku上)意味着您必须precompile
资产:
在生产中,Rails将这些文件预编译为public / assets 默认。然后,预编译的副本将作为静态资产提供 网络服务器。 app / assets中的文件永远不会直接提供 生产
这意味着如果您想在生产中加载资产,尤其是在Heroku上,您需要正确使用asset_paths
(主要是因为Rails将fingerprint
您的生产/编译资产)
-
<强>修正强>
直接参考你的问题,我会这样做:
1
:default_url => asset_path('avatar_:style.png') #-> not sure about the :style part here
2
:javascript
$('.star').raty({
path: asset_url, #-> will use the asset_url
readOnly: true,
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});
答案 1 :(得分:1)
资产管道不会让您的生活变得轻松 - Paperclip假设default_url
可以用:style
部分替换所需的值,但这不起作用,因为这显然很明显也改变文件名的指纹部分。
这里最简单的方法是不对这些图像使用资产管道。您不必真正使用资产管道,与javascript或css文件相比,图像的好处非常小。
要执行此操作,请将图像移至public/images
。然后,对于第一种情况,将默认URL更改为
/images/avatar_:style.png
并且对于第二种情况,将路径设置为/images
如果您愿意,可以使第二种情况适用于资产管道 - 类似
:javascript
$('.star').raty({
readOnly: true,
starHalf: '#{asset_path('star-half.png')}',
starOff: '#{asset_path('star-off.png')}',
starOn: '#{asset_path('star-on.png')}',
cancelOn: '#{asset_path('cancel-on.png')}',
cancelOff: '#{asset_path('cancel-off.png')}',
noRatedMsg : "I haven't been rated yet!",
score: function() {
return $(this).attr('data-score');
}
});