在Rails路由中禁止文件扩展名检测/格式映射

时间:2019-09-11 19:24:02

标签: ruby-on-rails url-routing

我有一个表单的Rails路线

get '/:collection/*files' => 'player#index'

其中files是用分号分隔的媒体文件列表,例如/my-collection/some-video.mp4%3Bsome-audio.mp3

这些由以下形式的控制器操作处理:

class PlayerController < ApplicationController
  def index
    @collection = params[:collection]
    @files = params[:files].split(';')
  end
end

,并使用显示每个文件的HTML5 <audio><video>元素的模板进行渲染。

只要文件没有扩展名,例如 /my-collection/file1%3Bfile2

但是,如果我添加文件扩展名, /my-collection/foo.mp3%3Bbar.mp4, 我得到:

  

没有路由与[GET]“ /my-collection/foo.mp3%3Bbar.mp4”匹配

如果我尝试使用单个文件,例如/my-collection/foo.mp3,我得到:

  

PlayerController#index缺少此请求格式和变体的模板。 request.formats:[“ audio / mpeg”] request.variant:[]

基于this answer,我向路由添加了正则表达式约束:

  get '/:collection/*files' => 'player#index', constraints: {files: /[^\/]+/}

这解决了没有路线匹配的问题,但是现在多个分隔的版本也因缺少模板而失败。 (无论如何,这都不理想,因为我仍然希望在文件值中允许/。但是/.*/的工作效果并不好。)

我尝试了format: false,有无constraints,但仍然缺少模板

我还尝试了一个普通的路径参数(/:collection/:files),并获得了与通配符*files相同的行为。

如何让Rails忽略并通过此路由的扩展名?


注意::我在Ruby 2.5.1上使用Rails 6.0.0。

1 个答案:

答案 0 :(得分:0)

在讨论this Rails issue之后,魔术公式似乎在defaults: {format: 'html'}上添加了format: false

  get '/:collection/:files',
      to: 'player#index',
      format: false,
      defaults: {format: 'html'},
      constraints: {files: /.*/}