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.
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)
适用于 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)
在其他答案的基础上(它拯救了我的培根!),我扩展了它以提供理智的后备:
开发中:
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选项分配给服务器涵盖了你。否则你得到零。
| 归档时间: |
|
| 查看次数: |
12180 次 |
| 最近记录: |