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

Ruby Rails:有选择地替换规范链接的主机名和参数,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,有没有一种方法可以以干净的方式选择性地替换Rails URL中的参数和主机名? 背景: 如果当前页面不规范,我需要在我的应用程序中生成链接(例如,URL中存在额外的参数,或者主机名可能是i18n子域,如es.mysite.com) 我喜欢能够使用url\u for(params.except(:foo))干净地删除参数;这似乎可以智能地使用我的路由来正确地咀嚼URL,我觉得这是防止URL或参数在将来更改时被破坏的最可靠的方法 但是对于修复主机名,除了在字符串级别上操作和使用正则表达式之外,我看不

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

背景:

如果当前页面不规范,我需要在我的应用程序中生成
链接(例如,URL中存在额外的参数,或者主机名可能是i18n子域,如
es.mysite.com

我喜欢能够使用
url\u for(params.except(:foo))
干净地删除参数;这似乎可以智能地使用我的路由来正确地咀嚼URL,我觉得这是防止URL或参数在将来更改时被破坏的最可靠的方法

但是对于修复主机名,除了在字符串级别上操作和使用正则表达式之外,我看不到一种干净的方法来直接将(例如)
es.mysite.com
替换为
mysite.com


手动解析字符串并不是世界末日,但我很高兴地了解到有一种方法可以执行如下操作:
url\u for(params.except(:foo),使用_host:“mysite.com”)

来处理url查看Ruby的内置模块或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):001:0>要求“可寻址/uri”
=>正确
irb(main):002:0>uri=Addressable::uri.parse(
irb(主要):003:1*http://example.com/a/b/c/?one=1&two=2#foo"
irb(主要):004:1>)
=> #
irb(主):005:0>uri.query\u值
=>{“一”=>“一”,“二”=>“二”}
irb(main):006:0>uri.query_值={'one'=>2,'two'=>1}
=>{“一”=>2,“二”=>1}
irb(主):007:0>uri
=> #
以下是如何与主机打交道:

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>
irb(main):008:0>uri.host
=>“example.com”
irb(main):009:0>uri.host='foo.com'
=>“foo.com”
irb(主):010:0>uri
=> #
URI是内置的,工作正常,但它显示了一些年龄。可寻址符合RFC,功能强大且功能齐全