Rails:有选择地替换规范链接的主机名和参数

时间:2012-06-23 21:47:09

标签: ruby ruby-on-rails-3

有没有办法以干净的方式有选择地替换Rails URL中的参数和主机名?

背景:

我需要在我的应用中生成<link rel="canonical" href="http://...">链接,以防当前页面不是规范的(例如,URL中存在额外的参数,或者主机名可能是es.mysite.com的i18n子域)

我希望能够使用url_for(params.except(:foo))来干净地删除参数;这似乎可以智能地使用我的路由来正确地修改URL,我觉得这是防止URL或参数在将来发生变化时最容易破坏的方法。

但是为了修复主机名,我没有看到一个很好的干净方法,直接替换(例如)es.mysite.commysite.com,除了在字符串级别上操作和使用正则表达式。

手动解析字符串不是世界末日,但我很高兴知道有一种方法可以执行以下操作:url_for(params.except(:foo), with_host: "mysite.com")

1 个答案:

答案 0 :(得分:2)

要按摩URL,请查看Ruby的内置URI模块或Addressable::URI gem。两者都让你沮丧和破坏URL并重建它们。

这是IRB使用Addressable :: URI:

的一个小例子
irb(main):001:0> require 'addressable/uri'
=> true
irb(main):002:0> uri = Addressable::URI.parse(
irb(main):003:1*       "http://example.com/a/b/c/?one=1&two=2#foo"
irb(main):004:1>   )
=> #<Addressable::URI:0x80c1561c URI:http://example.com/a/b/c/?one=1&two=2#foo>
irb(main):005:0> uri.query_values
=> {"one"=>"1", "two"=>"2"}
irb(main):006:0> uri.query_values={'one'=>2,'two'=>1}
=> {"one"=>2, "two"=>1}
irb(main):007:0> uri
=> #<Addressable::URI:0x80c1561c URI:http://example.com/a/b/c/?one=2&two=1#foo>

以下是如何处理主持人:

irb(main):008:0> uri.host
=> "example.com"
irb(main):009:0> uri.host = 'foo.com'
=> "foo.com"
irb(main):010:0> uri
=> #<Addressable::URI:0x80c1561c URI:http://foo.com/a/b/c/?one=2&two=1#foo>

URI内置并且工作正常,但它显示了一些年龄。可寻址符合RFC,功能强大且功能齐全。