Rails中的音频资产带来无路由匹配

cra*_*bob 16 ruby-on-rails asset-pipeline

我正在尝试在rails中使用音频文件.我创建了一个文件夹audiosapp\assets\.我想使用资产预编译,以便我不必将文件放在下面app\public

现在我得到了

ActionController::RoutingError (No route matches [GET] "/audios/audio_file.wav")
Run Code Online (Sandbox Code Playgroud)

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

pdo*_*obb 24

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

开发过程中,资产可以在相对URL中获得:/assets/<asset file name>.

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

生产中,资产预编译(通常)在部署时发生.此时,您的wav文件被复制到例如/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.