2009-10-12 10 views
16

Así que me gustaría que las instancias de mi aplicación Rails se registren en una especie de "Estoy arriba" con la que estoy jugando, y me gustaría que pueda mencionar en qué puerto local se está ejecutando. Parece que no puedo encontrar la forma de hacerlo; de hecho, descubrir su IP es complicado y necesita un truco.¿Cómo encontrar el puerto local en el que se está ejecutando una instancia de raíles?

Pero no hay problema, tengo la IP, pero ¿cómo puedo encontrar en qué puerto se está ejecutando mi servidor mestrel/thin/webrick?

Para ser súper explícito, si inicio una aplicación de rieles utilizando script/server -p 3001, ¿qué puedo hacer para extraer ese 3001 dentro de la aplicación?

+0

paradero se le pone el código que hace el registro? – mikej

+0

Me gustaría que estuviera en un inicializador, pero podría ser de todos modos. Lo importante es que puede anunciarse en otra máquina: "hola, comencé en el puerto # {PORT}", donde el puerto podría ser cualquier cosa. Básicamente, Rails equivalente a Sinatra :: Application.port. – RailFan

+0

La mayoría de las respuestas a la pregunta de nombre de host también responden a esto: http://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails –

Respuesta

14

Desde el interior de cualquier acción del controlador, compruebe el contenido de request.port, por lo tanto:

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

Tan simple y tan fácilmente pasado por alto. Pensé en esto por unos minutos y estaba pensando en cómo conseguirlo. Esta pregunta es un buen recordatorio para que vuelva a revisar la solicitud. http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html – Jim

+0

Preciso para localhost, pero no funciona cuando está detrás de un servidor Apache o en una configuración de clúster. – Swanand

+0

Gracias por la respuesta. ¿Tiene alguna idea de cómo acceder a eso programáticamente, es decir, algo que puedo hacer dentro de la secuencia de comandos/consola? Después de todo, si necesito acceder a través de HTTP, ¡eso significa que ya conozco el puerto! – RailFan

15

Puede llamar Rails::Server.new.options[:Port] para obtener el puerto que el servidor se está ejecutando en los carriles. Esto analizará los argumentos -p 3001 del comando rails server, o por defecto al puerto 3000.

+2

Esto funcionará en el inicializador ya que no depende del objeto de solicitud. – superluminary

+3

'(rdb: 1) Rails :: Server *** NameError Excepción: constante no inicializada Rails :: Server' – zuba

+2

Pruebe' Rack :: Server.new.options [: Port] 'en las versiones más nuevas de Rails – asgeo1

9

De dos maneras.

Si usted está respondiendo a una petición de un controlador o ver, utilizar el objeto de solicitud:

request.port 

Si estás en un inicializador y no tiene acceso al objeto de solicitar el uso de la hash opciones de servidor:

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

'(rdb: 1) Rails :: Servidor *** NameError Excepción: constante no inicializada Rails :: Server' – zuba

+0

@zuba, eso es interesante. ¿Eso ocurrió en tu inicializador? – superluminary

+0

Lo siento, no, eso ocurrió en mi controlador rspec test debug console – zuba

2

Para Rails 5.1 servidor de desarrollo.

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

He jugado un poco con esto un poco, y esto podría ser la mejor solución para Rails 5.1:

Rails::Server::Options.new.parse!(ARGV)[:Port] 
Cuestiones relacionadas