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

Rai*_*Fan 20 ruby ruby-on-rails

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

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

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

ndb*_*ent 17

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

  • `(rdb:1)Rails :: Server***NameError异常:未初始化的常量Rails :: Server` (4认同)
  • 这将在初始化器中起作用,因为它不依赖于请求对象. (3认同)
  • 在较新版本的Rails中尝试`Rack :: Server.new.options [:Port]` (2认同)
  • `Rack :: Server.new.options [:Port]`总是返回9292 (2认同)

Lar*_*eth 15

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

class SomeController < ApplicationController
  def some_action
    raise "I'm running on port #{request.port}."
  end
end
Run Code Online (Sandbox Code Playgroud)


sup*_*ary 10

两种方式.

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

request.port
Run Code Online (Sandbox Code Playgroud)

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

Rails::Server.new.options[:Port]
Run Code Online (Sandbox Code Playgroud)

  • `(rdb:1)Rails :: Server***NameError异常:未初始化的常量Rails :: Server` (3认同)
  • 您可能必须先要求相应的库.`require'rail/commands/server' (3认同)

hir*_*shi 5

适用于 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
Run Code Online (Sandbox Code Playgroud)


小智 5

我对此进行了一些尝试,这可能是Rails 5.1的最佳解决方案:

Rails::Server::Options.new.parse!(ARGV)[:Port]
Run Code Online (Sandbox Code Playgroud)


Dav*_*mpy 5

在其他答案的基础上(它拯救了我的培根!),我扩展了它以提供理智的后备:

开发中:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 3000 rescue 3000
Run Code Online (Sandbox Code Playgroud)

在所有其他环境中:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80
Run Code Online (Sandbox Code Playgroud)

rescue 80如果你正在跑步,它会覆盖你rails console。否则,它会引发NameError: uninitialized constant Rails::Server。(也许也是在初始化器的早期?我忘记了......)

|| 80如果没有-p选项分配给服务器涵盖了你。否则你得到零。