Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何找到运行rails实例的本地端口?_Ruby On Rails_Ruby - Fatal编程技术网

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

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

因此,我希望我的Rails应用程序实例在我正在玩的“I'm up”类型的东西上注册自己,并且我希望它能够提到它在哪个本地端口上运行。我似乎找不到如何做到这一点——事实上,仅仅找到它的IP是很棘手的,需要一点技巧

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


超级明确地说,如果我使用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
在更新版本的Rails
Rack::Server.new.options[:Port]
始终返回9292I-found
Rack::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