【问题标题】:How to change default :id in address to :filename如何将地址中的默认 :id 更改为 :filename
【发布时间】:2019-07-20 13:58:35
【问题描述】:
您好,我是 Rails 新手,正在寻找如何更改默认地址的解决方案
http://0.0.0.0:3000/files/5
到
http://0.0.0.0:3000/files/filename
或
http://0.0.0.0:3000/files/5+filename+sometext
我正在使用 ActiveStorage 存储文件,我更喜欢使用 blob 表中的文件名。
我在哪里可以找到解决方案?路线?
【问题讨论】:
标签:
ruby-on-rails
rails-activestorage
【解决方案1】:
我认为https://guides.rubyonrails.org/routing.html#non-resourceful-routes 拥有你想要的答案。
您需要一个非资源丰富的动态路由。
get 'files/:file_name', to: 'files#serve_file' # , constraints: { file_name: /regex_here/ }
然后 'files/your_file_name' 将路由到文件控制器的 serve_file 操作,params 将具有 { file_name: 'your_file_name' }。然后,您可以根据需要处理提供文件。
确保将这条路线放在您的resources :files 上方,否则我相信它不会起作用,并且请注意这条路线会阻塞一些资源丰富的路线。例如,url 'files/new' 将被路由到带有参数的 files#serve_file:{ file_name: 'new' }。
一种解决方案是在路由中添加一个额外的静态段。
get 'files/serve/:file_name', to: 'files#serve_file'
另请注意,从文档中:
默认情况下,动态段不接受点 - 这是因为
dot 用作格式化路线的分隔符。如果您需要使用
点在动态段中,添加一个覆盖它的约束 -
例如, id: /[^/]+/ 允许除斜线以外的任何内容。