这有点奇怪。
我有一条路线:
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
答案 0 :(得分:8)
使用program/*program_id
代替program/:program_id
。
答案 1 :(得分:4)
...只有字母数字,特殊字符“$ -_。+!*'(),”和用于保留目的的保留字符可以在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"