关于第三方js库的rails 4资产管道感到困惑

时间:2014-06-23 20:45:46

标签: ruby-on-rails heroku ruby-on-rails-4 asset-pipeline

我有两个问题,但我猜他们都会得到同样的答案。

它们都与静态图像显示在开发模式而非生产(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.pngavatar_medium.png/app/assets/images

CASE 2 中,我尝试使用第三方库raty来实施5星评级功能,这需要&#34; 明星&# 34;图片。我已在/app/assets/images中放置了此库附带的三张图片。

问题:在这两种情况下,图像都是在开发模式下看到的,但在部署到Heroku时却看不到。我该如何解决这个问题。

P.S。:我绝对不熟悉rails,任何帮助都会受到赞赏。

2 个答案:

答案 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');
    }
  });