1

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

背景:

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

我喜欢能够用来url_for(params.except(:foo))干净地删除参数;这似乎可以智能地使用我的路由来正确调整 URL,我觉得这是在将来 URL 或参数更改时防止损坏的最防弹方法。

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

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

4

1 回答 1

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 是内置的并且工作正常,但它显示了一些年龄。Addressable 符合 RFC 并且非常强大且功能齐全。

于 2012-06-23T22:53:40.530 回答