我有一个方法可以生成一个随机的url结尾和一个看起来像
的get路径 /path/var1/var2
唯一的问题是,其中一些为var2生成的值中包含“/”。因此,如果var 2是“h4rd / erw”,则rails将其读为
/path/var1/h4rd/erw
或
/path/var1/var2/var3
rails认为这是路由的另一个参数,我不断得到错误
No route matches.
我已经考虑过将var2的生成值设置为不包含“/”s,或者可能在路径中放置通配符(如果可能的话是/ path / var1 / *)。对此最好的解决方案是什么?
答案 0 :(得分:2)
您可以使用route globbing:
get '/path/var1/*var2', to: 'controller#action'
假设请求转到/path/var1/h4rd/erw
。然后在控制器操作中,params[:var2]
的值为h4rd/erw
。
答案 1 :(得分:1)
我会确保值始终被转义。
string = "my/string"
=> "my/string"
CGI.escape(string)
=> "my%2Fstring"
所以你的网址就像
/path/var1/h4rd%2Ferw
然后它将转到右侧控制器并设置正确的变量。
Rails将自动取消控制器中参数的值" params"变量,所以当你处理控制器中的值时,斜杠将返回到字符串中。
唯一剩下的问题是何时进行逃避。如果将值作为参数传递给路径助手,那么rails应该自动为它转义,如下所示:
link_to "Here", my_route_path(:foo => "bar")