Ruby on rails 如何找到运行rails实例的本地端口?
因此,我希望我的Rails应用程序实例在我正在玩的“I'm up”类型的东西上注册自己,并且我希望它能够提到它在哪个本地端口上运行。我似乎找不到如何做到这一点——事实上,仅仅找到它的IP是很棘手的,需要一点技巧 但没问题,我有IP,但我如何找到我的mongrel/thin/webrick服务器运行的端口Ruby on rails 如何找到运行rails实例的本地端口?,ruby-on-rails,ruby,Ruby On Rails,Ruby,因此,我希望我的Rails应用程序实例在我正在玩的“I'm up”类型的东西上注册自己,并且我希望它能够提到它在哪个本地端口上运行。我似乎找不到如何做到这一点——事实上,仅仅找到它的IP是很棘手的,需要一点技巧 但没问题,我有IP,但我如何找到我的mongrel/thin/webrick服务器运行的端口 超级明确地说,如果我使用script/server-p3001启动rails应用程序,我可以如何在应用程序内部拉取该3001。从任何控制器操作内部,检查request.port的内容,因此: c
超级明确地说,如果我使用script/server-p3001启动rails应用程序,我可以如何在应用程序内部拉取该3001。从任何控制器操作内部,检查request.port的内容,因此:
class SomeController
您可以调用Rails::Server.new.options[:Port]
来获取运行Rails服务器的端口。这将从您的rails服务器
命令解析-p3001
参数,或者默认为端口3000
两种方式。
如果您在控制器或视图中响应请求,请使用请求对象:
request.port
如果您在初始化器中,并且无权访问请求对象,请使用服务器选项哈希:
Rails::Server.new.options[: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
我对此做了一些研究,这可能是Rails 5.1的最佳解决方案:
Rails::Server::Options.new.parse!(ARGV)[:Port]
在其他答案的基础上(这拯救了我的培根!),我扩展了这一点,给出了合理的回退: 发展中:
port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 3000 rescue 3000
在所有其他环境中:
port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80
如果您正在运行rails控制台,则rescue 80
会覆盖您。否则,它将引发namererror:uninitialized constant Rails::Server
。(也可能是在初始值设定的早期?我忘了…)
如果为服务器提供了no-p选项,则|80
将覆盖您。否则你会得到零。你把注册的代码放在哪里了?我希望它是一个初始值设定项,但无论如何都可能是真的。重要的是它能够向另一台机器宣布它自己——“嗨,我是从#{port}端口启动的”——在那里端口可以是任何东西。基本上,Rails相当于Sinatra::Application.port。主机名问题的大多数答案也回答了这个问题:非常简单,很容易被忽略。我想了几分钟,想了想如何得到它。这个问题是一个很好的提醒,提醒我再次审查请求。对于localhost精确,但在Apache服务器后面或集群设置中不起作用。感谢您的回答。您知道如何通过编程方式访问它吗(即我可以在脚本/控制台中执行的操作)?毕竟,如果我需要通过HTTP访问它,那意味着我已经知道了端口!这将在初始化器中工作,因为它不依赖于请求对象。(rdb:1)Rails::Server***名称错误异常:未初始化的常量Rails::Server
在更新版本的RailsRack::Server.new.options[:Port]
始终返回9292I-foundRack::Server.new.options[:Port]
如果使用“-p”选项(Rails 5.1.1)指定,则返回端口。(rdb:1)Rails::Server***name错误异常:未初始化常量Rails::Server
@zuba,这很有趣。您的初始值设定项中是否发生了这种情况?抱歉,没有,在我的控制器rspec测试调试控制台中发生了这种情况。您可能需要先使用相应的库require'rails/commands/server'
@SethJeffery,它起作用了,但我有一点警告:通过require-rails-server命令,您不能将参数传递给cucumber/rspec,因为rails服务器启动器将引发一个异常,声称他得到了错误的参数。当没有指定显式端口时,它返回nil
port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80