如何找到运行rails实例的本地端口?

因此,我希望我的Rails应用程序实例能够在我正在使用的“我正在进行”的事情上进行自我注册,并且我希望它能够提及它正在运行的本地端口。 我似乎无法找到如何做到 – 实际上只是发现它的IP是棘手的,需要一点点黑客攻击。

但没问题,我有IP – 但我怎样才能找到我的mongrel / thin / webrick服务器正在运行的端口?

要超级明确,如果我使用脚本/服务器-p 3001启动rails应用程序,我该怎么做才能在应用程序中提取3001。

您可以调用Rails::Server.new.options[:Port]来获取运行Rails服务器的端口。 这将从您的rails server命令解析-p 3001 args,或默认为端口3000

从任何控制器操作内部,检查request.port的内容,因此:

 class SomeController < ApplicationController def some_action raise "I'm running on port #{request.port}." end end 

两种方式。

如果您在控制器或视图中响应请求,请使用请求对象:

 request.port 

如果您在初始化程序中并且无法访问请求对象,请使用服务器选项哈希:

 Rails::Server.new.options[:Port] 

我玩了一下这个,这可能是Rails 5.1的最佳解决方案:

 Rails::Server::Options.new.parse!(ARGV)[:Port] 

对于Rails 5.1开发服务器。

 if Rack::Server.new.options[:Port] != 9292 # rals s -p PORT local_port = Rack::Server.new.options[:Port] else local_port = (ENV['PORT'] || '3000').to_i # ENV['PORT'] for foreman end 

在其他答案的基础上(保存了我的培根!),我扩展了这个以给出理智的后备:

开发中:

 port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 3000 rescue 3000 

在所有其他环境中:

 port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80 

如果您正在运行rails consolerescue 80覆盖您。 否则,它会引发NameError: uninitialized constant Rails::Server 。 (也许在初始化器的早期?我忘了…)

|| 80 如果没有为服务器提供-p选项,则|| 80覆盖您。 否则你会得到零。