2009-10-12 2 views
16

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

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

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

+0

Whereabouts вы поставить код, который делает регистрирующий? – mikej

+0

Я бы хотел, чтобы это было в инициализаторе, но это может быть так или иначе. Важно то, что он может объявить себя другой машине - «Привет, я был запущен на порту # {PORT}» - где порт мог быть чем угодно. В принципе, Rails эквивалентен Sinatra :: Application.port. – RailFan

+0

Большинство ответов на вопрос имени хоста также отвечают на это: http://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails –

ответ

14

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

class SomeController < ApplicationController 
    def some_action 
    raise "I'm running on port #{request.port}." 
    end 
end 
+0

Так просто и так легко упустить. Я подумал об этом несколько минут и думал о способах его получения. Этот вопрос является хорошим напоминанием для меня снова просмотреть запрос. http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html – Jim

+0

Точный для локального хоста, но не работает, если за сервером Apache или в настройке кластера. – Swanand

+0

Спасибо за ответ. Вы знаете, как получить доступ к этому программному обеспечению, то есть что-то, что я могу сделать внутри скрипта/консоли? В конце концов, если мне нужно получить к нему доступ через HTTP, это означает, что я уже знаю порт! – RailFan

15

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

+2

Это будет работать в инициализаторе, так как оно не зависит от объекта запроса. – superluminary

+3

'(rdb: 1) Rails :: Server *** ИмяError Исключение: неинициализированная константа Rails :: Server' – zuba

+2

Попробуйте' Rack :: Server.new.options [: Port] 'в новых версиях Rails – asgeo1

9

Два способа.

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

request.port 

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

Rails::Server.new.options[:Port] 
+3

'(rdb: 1) Rails :: Server *** ИмяError Исключение: неинициализированные константы Rails :: Server' – zuba

+0

@zuba, это интересно. Это произошло в вашем инициализаторе? – superluminary

+0

Простите, нет, что произошло в моем контроллере. Отладка консоли rspec. – zuba

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 
0

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

Rails::Server::Options.new.parse!(ARGV)[:Port] 
Смежные вопросы