所以我希望我的Rails应用程序实例在我正在玩的“我正在”的事情上注册自己,并且我希望它能够提及它正在运行的本地端口。我似乎无法找到如何做到 - 实际上只是发现它的IP是棘手的,需要一点点黑客。
但没问题,我有IP - 但是如何找到运行mongrel / thin / webrick服务器的端口?
要超级明确,如果我使用脚本/服务器-p 3001启动rails应用程序,我该怎么做才能在应用程序中提取3001。
答案 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
将覆盖您。否则你将得到零。