【问题标题】:Protocol relative URLs missing port in Rails URL helpersRails URL 帮助程序中的协议相对 URL 缺少端口
【发布时间】:2014-05-09 13:39:52
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

    标签: ruby-on-rails url routes urlhelper


    【解决方案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 字符串。

    现在,如果您设置 protocol: falsenormalize_protocol 将返回 \\

    normalize_port 然后查看options[:protocol] 如果options[:protocol] == '//' 则返回nil,无论您是在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" 
    

    【讨论】:

    • 不错的一个! +1 用于提出拉​​取请求,而不仅仅是一个问题。
    • 他们刚刚合并。谢谢,你启发了我@graeme-mclean :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2021-03-17
    • 1970-01-01
    • 2015-03-09
    • 2011-10-19
    相关资源
    最近更新 更多