1

我正在尝试使用 Rails URL 帮助程序生成协议相对 URL。为此,我将协议选项设置为 false。但是每当我生成一个 URL 时,该port部分就丢失了。

dashboard (master) > rails c
Loading development environment (Rails 4.0.3)
2.0.0p247 :001 >   include Rails.application.routes.url_helpers
 => Object
2.0.0p247 :002 > tunnels_url(host: "0.0.0.0:3000", protocol: false)
 => "//0.0.0.0/tunnels"

问题是:我想为自定义端口生成协议相对 URL。

4

1 回答 1

1

这似乎是故意的。从url.rb,有代码:

options[:protocol] = normalize_protocol(options)
options[:host]     = normalize_host(options)
options[:port]     = normalize_port(options)

result << options[:protocol]
result << rewrite_authentication(options)
result << options[:host]
result << ":#{options[:port]}" if options[:port]

result最终成为您要构建的 url 字符串。

现在,normalize_protocol如果\\您设置protocol: false

normalize_port然后查看是否options[:protocol]专门返回,nil无论options[:protocol] == '//'您是在选项中包含端口host还是专门提供port选项。

通过按此顺序进行规范化,您想要的核心代码似乎是不可能的。

我不知道这是疏忽还是故意的。也许有人认为没有协议就不能拥有端口。无论如何,提出 Rails 的问题可能是值得的。

同时,您可以使用gsub. 不是很出色,但可能总比没有好。就像是:

2.0.0-p247 :002 > tunnels_url(host: "0.0.0.0port", protocol: false).gsub('port',':3000')
 => "//0.0.0.0:3000/tunnels" 
于 2014-05-09T16:01:24.600 回答