Как найти локальный порт, на котором работает экземпляр rails? - PullRequest
19 голосов
/ 12 октября 2009

Итак, я бы хотел, чтобы экземпляры моего приложения Rails регистрировали себя на предмете типа «Я встаю», с которым я играю, и я бы хотел, чтобы он мог упоминать, на каком локальном порту он работает. Кажется, я не могу найти, как это сделать - на самом деле просто выяснить его IP сложно и нужно немного взломать.

Но не проблема, у меня есть IP - но как мне узнать, на каком порту работает мой сервер mongrel / thin / webrick?

Проще говоря, если я запускаю приложение rails с помощью скрипта / сервера -p 3001, что я могу сделать, чтобы вытащить этот 3001 внутри приложения.

Ответы [ 6 ]

17 голосов
/ 12 декабря 2012

Вы можете позвонить Rails::Server.new.options[:Port], чтобы узнать порт, на котором работает ваш сервер Rails. Это будет анализировать аргументы -p 3001 из вашей команды rails server или по умолчанию использовать порт 3000.

15 голосов
/ 12 октября 2009

Внутри любого действия контроллера проверьте содержимое request.port , таким образом:

class SomeController < ApplicationController
  def some_action
    raise "I'm running on port #{request.port}."
  end
end
10 голосов
/ 20 мая 2013

Два пути.

Если вы отвечаете на запрос в контроллере или представлении, используйте объект запроса:

request.port

Если вы находитесь в инициализаторе и не имеете доступа к объекту запроса, используйте хэш параметров сервера:

Rails::Server.new.options[:Port]
5 голосов
/ 03 января 2018

Я немного поиграл с этим, и это может быть лучшим решением для Rails 5.1:

Rails::Server::Options.new.parse!(ARGV)[:Port]
2 голосов
/ 12 октября 2018

Основываясь на других ответах (которые спасли мой бекон!), Я расширил это, чтобы дать вменяемые откаты:

В разработке:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 3000 rescue 3000

Во всех других env:

port = Rails::Server::Options.new.parse!(ARGV)[:Port] || 80 rescue 80

rescue 80 покрывает вас, если вы используете rails console. В противном случае он поднимает NameError: uninitialized constant Rails::Server. (Может быть, также рано в инициализаторах? Я забыл ...)

|| 80 покрывает вас, если опция -p не указана для сервера. В противном случае вы получите ноль.

2 голосов
/ 12 июля 2017

Для сервера разработки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...