我有一个表单的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。
答案 0 :(得分:0)
在讨论this Rails issue之后,魔术公式似乎在defaults: {format: 'html'}
上添加了format: false
:
get '/:collection/:files',
to: 'player#index',
format: false,
defaults: {format: 'html'},
constraints: {files: /.*/}