如何查找正在运行rails实例的本地端口?

时间:2009-10-12 12:25:21

标签: ruby-on-rails ruby

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

但没问题,我有IP - 但是如何找到运行mongrel / thin / webrick服务器的端口?

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

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:15)

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

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

答案 2 :(得分:10)

两种方式。

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

request.port

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

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

对于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

答案 5 :(得分:2)

在其他答案(节省了培根!)的基础上,我扩展了此功能以提供合理的备用:

开发中:

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

在所有其他环境中:

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

如果您正在运行rescue 80,则rails console将覆盖您。否则,它将引发NameError: uninitialized constant Rails::Server。 (也许还早于初始化程序?我忘记了...)

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