我正在尝试使用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,但是需要自定义端口。
答案 0 :(得分: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
最终成为您要构建的网址字符串。
现在,如果您设置normalize_protocol
\\
将返回protocol: false
normalize_port
然后查看options[:protocol]
专门返回nil
options[:protocol] == '//'
host
,无论您是在port
选项中包含该端口,还是具体提供gsub
1}}选项。
按照这个顺序进行规范化,你想要的核心代码似乎是不可能的。
我不知道这是疏忽还是故意。也许你认为没有协议就没有端口。无论如何,使用Rails提出问题可能是值得的。
与此同时,您可以使用2.0.0-p247 :002 > tunnels_url(host: "0.0.0.0port", protocol: false).gsub('port',':3000')
=> "//0.0.0.0:3000/tunnels"
解决此问题。没有辉煌,但可能总比没有好。类似的东西:
{{1}}