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

时间:2013-12-18 06:38:24

标签: ruby-on-rails url routes

我正在尝试将音频URL作为Ruby on Rails中的参数传递,并且谷歌搜索“如何在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

值得注意的是,网址的构造变化足以构建它们很麻烦。 (例如,一些以http和一些https开头。)如何保留我的网址的语法?或者是否有更好的方法将所有参数一起传递?

3 个答案:

答案 0 :(得分:4)

为什么不将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和unencode进行编码:

{ 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"}

答案 1 :(得分:2)

您应该在将参数传递到

之前对其进行url编码

答案 2 :(得分:0)

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只匹配网址的正则表达式。
  2. format => false将忽略网址
  3. 的点部分