2013-02-26 8 views
5

Mi piacerebbe creare un URL utilizzando un endpoint e un percorso o un host e percorso. Purtroppo URI.join non permette di farlo:creare un URL utilizzando l'host e più stringhe di percorso in Rails

pry(main)> URI.join "https://service.com", "endpoint", "/path" 
=> #<URI::HTTPS:0xa947f14 URL:https://service.com/path> 
pry(main)> URI.join "https://service.com/endpoint", "/path" 
=> #<URI::HTTPS:0xabba56c URL:https://service.com/path> 

e quello che voglio è: "https://service.com/endpoint/path". Come potrei farlo in Ruby/Rails?

EDIT: Come il URI.join ha qualche inconveniente, ho tentato di usare File.join:

URI.join("https://service.com", File.join("endpoint", "/path")) 

Cosa ne pensi?

+1

Partenza: http://stackoverflow.com/questions/8900782/how-do-i-safely-join-relative-url-segments –

risposta

6

URI.join funziona come quello che ci si aspetta da un tag <a> per funzionare.

Si sta unendo example.com, endpoint, /path, in modo da /path vi porta di nuovo alla radice del dominio, invece di aggiungerlo.

È necessario terminare l'endpoint con / e non avviare il percorso con /.

URI.join "https://service.com/", "endpoint/", "path" 
=> #<URI::HTTPS:0x007f8a5b0736d0 URL:https://service.com/endpoint/path> 

Edit: secondo la vostra richiesta nel commento qui sotto, provate questo:

def join(*args) 
    args.map { |arg| arg.gsub(%r{^/*(.*?)/*$}, '\1') }.join("/") 
end 

prova:

> join "https://service.com/", "endpoint", "path" 
=> "https://service.com/endpoint/path" 
> join "http://example.com//////", "///////a/////////", "b", "c" 
=> "http://example.com/a/b/c" 
+0

Grazie. Tuttavia, mi piacerebbe non preoccuparmi delle barre (mancanza di barra, doppia barra e così via), perché 'URI.join (" https://service.com/ "," endpoint "," percorso ")' non funziona correttamente Quindi l'intero URI.join nel mio caso è utile quanto la semplice concatenazione di stringhe.Conoscete un metodo "automatico" di concatenazione dei percorsi negli URI senza curare le barre? – mrzasa

+0

@mrzasa, prova la funzione che ho aggiunto alla mia risposta sopra. – Dogbert

+1

@mrzasa, 'URI.join' funziona perfettamente, se fornito dei valori necessari. Mentre non vuoi preoccuparti, devi farlo perché è quello che fanno i programmatori. Dobbiamo essere consapevoli del contenuto dei valori che stiamo trasmettendo ai metodi, in modo che ciò che viene restituito sia ciò che ci aspettiamo. Ecco una cosa a cui pensare: "In due occasioni mi è stato chiesto: - Prega, signor Babbage, se metti nella macchina cifre errate, verranno le risposte giuste?" ... Non sono in grado giustamente di cogliere il tipo di confusione di idee che potrebbe provocare una simile domanda ". -Charles Babbage, Passaggi dalla vita di un filosofo –

3

Sembra controlli URI.join per la presenza di carattere barra '/'per calcolare la cartella nel percorso dell'URL. Quindi, se hai perso la barra finale nel percorso, non la tratterà come cartella, e la ometterò. Check this out:

URI.join("https://service.com", 'omitted_part', 'omitted_again', 'end_point_stays').to_s 
# =>"https://service.com/end_point_stays" 

Qui, se cerchiamo di aderire al solo parole, primo e l'ultimo params rimangono solo, il resto sono omessi, dove prima param è, URI assoluto con protocollo & ultimo param è il punto finale .

Quindi, se si desidera includere il componente della cartella, add slash in ogni cartella componenti, parte allora solo è considerato del percorso:

URI.join("https://service.com", 'omitted_no_trailing_slash', 'omitted_again', 'stays/', 'end_point_stays').to_s 
# => "https://service.com/stays/end_point_stays" 

Una cosa più interessante da considerare è che, se si sta fornendo percorso nel primo parametro si agisce come segue:

URI.join("https://service.com/omitted_because_no_trailing_slash", 'end_point_stays').to_s 
# => "https://service.com/end_point_stays" 
URI.join("https://service.com/stays_because_of_trailing_slash/", 'end_point_stays').to_s 
# => "https://service.com/stays_because_of_trailing_slash/end_point_stays" 
URI.join("https://service.com/safe_with_trailing_slash/omitted_because_no_trailing_slash", 'end_point_stays').to_s 
# => "https://service.com/safe_with_trailing_slash/end_point_stays" 
Problemi correlati