2009-10-12 10 views
16

Quindi vorrei che le istanze dell'applicazione Rails si registrassero su un tipo di "I'm up" con cui sto giocando, e mi piacerebbe che fosse in grado di menzionare quale porta locale è in esecuzione. Non riesco a trovare il modo di farlo - in effetti solo scoprire la sua IP è complicato e ha bisogno di un po 'di trucco.Come trovare la porta locale su cui è in esecuzione un'istanza di rotaie?

Ma nessun problema, ho l'IP - ma come posso trovare su quale porta è in esecuzione il mio server mongrel/thin/webrick?

Per essere super esplicito, se avvio un'applicazione di rotaie usando script/server -p 3001, cosa posso fare per estrarre il 3001 dall'app.

+0

permanenza stai mettendo il codice che fa la registrazione? – mikej

+0

Mi piacerebbe che fosse in un inizializzatore, ma potrebbe essere comunque molto. L'importante è che sia in grado di annunciarsi su un'altra macchina - "Ciao, sono stato avviato sulla porta # {PORT}" - dove la porta potrebbe essere qualsiasi cosa. Fondamentalmente, Rails equivalenti a Sinatra :: Application.port. – RailFan

+0

La maggior parte delle risposte alla domanda hostname rispondono anche a questo: http://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails –

risposta

14

Da all'interno di qualsiasi azione di controllo, controllare il contenuto della request.port, in tal modo:

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

Così semplice e così facilmente trascurato. Ci ho pensato per alcuni minuti e ho riflettuto su come ottenerlo. Questa domanda è un buon promemoria per me di riesaminare la richiesta di nuovo. http://api.rubyonrails.org/classes/ActionController/AbstractRequest.html – Jim

+0

Preciso per localhost, ma non funziona dietro un server Apache o in una configurazione cluster. – Swanand

+0

Grazie per la risposta. Hai idea di come accedere a quello programmaticamente, cioè qualcosa che posso fare all'interno di script/console? Dopotutto, se ho bisogno di accedervi tramite HTTP, significa che conosco già la porta! – RailFan

15

È possibile chiamare Rails::Server.new.options[:Port] per ottenere la porta che il server Rails è in esecuzione. Questo analizzerà gli argomenti -p 3001 dal tuo comando rails server, o il valore predefinito alla porta 3000.

+2

Funzionerà nell'inizializzatore in quanto non dipende dall'oggetto richiesta. – superluminary

+3

'(rdb: 1) Rails :: Server *** NameError Eccezione: costante non inizializzata Rails :: Server' – zuba

+2

Prova' Rack :: Server.new.options [: Port] 'nelle versioni più recenti di Rails – asgeo1

9

Due modi.

Se stai rispondendo a una richiesta in un controller o vista, utilizzare l'oggetto di richiesta:

request.port 

Se siete in un initialiser e non hanno accesso all'oggetto richiesta di utilizzare il hash delle opzioni del server:

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

'(rdb: 1) Rails :: Server *** NameError Eccezione: costante non inizializzata Rails :: Server' – zuba

+0

@zuba, è interessante. Questo si è verificato nel tuo inizializzatore? – superluminary

+0

Spiacente, no, che si è verificato nel mio controller console di debug di test rspec – zuba

2

Per server di sviluppo 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

Ho suonato in giro con questo un po ', e questo potrebbe essere la soluzione migliore per Rails 5.1:

Rails::Server::Options.new.parse!(ARGV)[:Port] 
Problemi correlati