将URL作为Rails中的参数传递

时间:2011-04-12 21:46:44

标签: ruby-on-rails

这有点奇怪。

我有一条路线:

match "program/:program_id" => "program#details"

调用它时,一切正常:

/program/1

但是,我使用的程序ID不仅仅是数字。它们实际上就是这样的网址:crid://blah.com/d1e5

如何通过RESTful方法传递URL作为参数?

显然,调用此方法不起作用:

/program/crid://blah.com/d1e5
/program/crid%3A%2F%2Fblah.com%2Fd1e5

2 个答案:

答案 0 :(得分:8)

使用program/*program_id代替program/:program_id

答案 1 :(得分:4)

RFC 1738说:

  

...只有字母数字,特殊字符“$ -_。+!*'(),”和用于保留目的的保留字符可以在URL中以未编码的方式使用。

因此,如果您尝试将网址添加到网址中,您将需要忍受编码字符,因为冒号:是除了作为协议分隔符之外,不是允许的字符,并且因为除了URL的根目录之外不允许使用双斜杠//,或者您必须从URL中删除协议和根并从域开始。那就是:

你可以这样做:

/program/crid%3A%2F%2Fblah.com%2Fd1e5

或者

/program/blah.com/d1e5

使用Rails时的妥协可能是将协议放入URL段,如下所示:

/program/crid/blah.com/d1e5

您可以使用

params数组中收集
match "program/:protocol/*program_id" => "program#details

*program_id段将其余网址收集(全局)到params数组中的单个条目中。

如果需要,您可以在控制器中重新组合:

url = "#{params[:protocol]://#{params[:program_id]}}"

这样:

# GET /program/crid/blah.com/d1e5
params[:protocol]   #=> "crid"
params[:program_id] #=> "blah.com/d1e5"
url = "#{params[:protocol]://#{params[:program_id]}}"
#=> "crid://blah.com/d1e5"