在Ruby on Rails路由中,将URL作为参数传递

4

我正在尝试在Ruby on Rails中将音频URL作为参数传递,搜索“如何在URL中传递URL”已经成为了一个问题。问题是,我只能获得不包含一个关键斜杠的URL。

我的路由如下:

get 'my_page/:title/*url', to: 'my_page', action: 'show'

该变量在控制器中定义如下:

@url=params[:url]

因此请求会像这样:

www.my_app.com/my_page/im_a_title/http://im_a_url.mp3

然而,url变量最终会在前缀后面缺少斜杠:

http:/im_a_url.mp3 <--notice the missing forward slash

需要注意的是,URL的构造方式有所不同,构造起来可能会很麻烦。(例如,有些以http开头,有些以https开头。)我该如何保留我的URL语法?或者说,有没有更好的方法来传递这个参数呢?

3个回答

6

为什么不将url作为必需参数传递呢?这样你就可以使用内置的to_query函数。

get 'files/:title' => 'files#show'

还有在文件控制器中

class FilesController < ApplicationController

  def show
    url = params.fetch(:url) # throws error if no url
  end

end

你可以这样对 URL 进行编码和解码:

您可以对URL进行编码和解码,如下所示:

{ url: 'http://im_a_url.mp3' }.to_query
# => "url=http%3A%2F%2Fim_a_url.mp3"
Rack::Utils.parse_query "url=http%3A%2F%2Fim_a_url.mp3"
# => {"url"=>"http://im_a_url.mp3"}

2

在传递参数之前,您应该对其进行URL编码


是的,谢谢,非常接近。不过现在我没有得到 .mp3 后缀。 - Bailey Smith

1
Rails 4
match 'my_page/:title/:url', to: 'my_page#show' , constraints: { url: /[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}/}, via: :get, :format => false
  1. constraints 只会匹配 url 的正则表达式。
  2. format => false 将忽略 url 的点部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接