17

我正在尝试在 Rails 中使用音频文件。我audiosapp\assets\. 我想使用资产预编译,这样我就不必将文件放在app\public

现在我得到

ActionController::RoutingError (No route matches [GET] "/audios/audio_file.wav")

如果我将 url 从更改URL/audios/audio_file.wavURL/assets/audio_file.wav它可以工作。我该如何解决这个问题?什么是正确的方法?

4

1 回答 1

26

首先,如果您还没有意识到:您的新app/assets/audios文件夹已经在加载路径中......您只需要重新启动服务器以便 Sprockets 将其拾取。

development中,资产在相对 url: 处可用/assets/<asset file name>

例如,假设您的 wav 文件位于/app/assets/audios/audio_file.wav文件系统中,则可以通过/assets/audio_file.wav浏览器中的相对 url 访问它。这是因为 Sprockets/Dev-Rails 在定位资产时知道要搜索/app/assets文件夹及其子目录。

生产环境中,资产预编译(通常)发生在部署时。此时,您的 wav 文件被复制到 eg/public/assets/audio_file-<MD5 fingerprint>.wav并且可以通过相对 url: 访问/assets/audio_file-<MD5 fingerprint>.wav

由于开发和生产之间使用不同的命名样式,任何时候你想引用一个资产,你都应该使用辅助方法(即使在 CSS 中!)。也就是说,生产包括 MD5 指纹,而开发不包括。但是,只要您使用助手,您就不必担心任何这些:

  • 对于图像:<%= image_tag('homes/logo.png') %>-- 给定一个存在于/app/assets/images/homes/logo.png文件系统中的图像文件。
  • 对于非标准资产,例如音频文件:<%= asset_path('audio_file.wav') %>,这将产生/assets/audio_file.wav.
于 2013-08-31T21:02:15.923 回答