tl; dr:底部簡短回答。
OK,假設你有一個類變量叫做@url
包含當前頁面的完全合格的URL:
require 'uri'
def full_url(rel, url)
return rel if rel.match /^[\w]*:\/\//
uri = URI(url)
if rel[0] == '/'
"#{uri.scheme}://#{uri.host}#{rel}"
else
path = uri.path.split('/')[0..-2].select{|m| !m.empty?}.join('/')
"#{uri.scheme}://#{uri.host}/#{path}/#{rel}"
end
end
然後,您可以撥打:
links_array.push full_url(url, @url)
你可以把方法的相同的類或某處的助手類。它使用Ruby URI庫來查找完全限定URL的相關部分,然後從相對路徑構造一個新的URL。
如果相對路徑以'/'開始,它應該直接在主機之後。
如果它不以'/'開始,那麼它需要與當前頁面位於相同的虛擬目錄中。因此,如果當前頁面是:
http://www.host.com/aaa/bbb/ccc
和相對路徑是:
ddd
則輸出應該是:
http://www.host.com/aaa/bbb/ddd
然而,如果相對路徑是:
/ddd
那麼輸出應該是:
http://www.host.com/ddd
的代碼:
uri.path.split('/')[0..-2].select{|m| !m.empty?}.join('/')
需要完整的URL的路徑,將其分解在 '/' 給出的陣列(['aaa','bbb', 'ccc']
),然後刪除最後一個元素。 (['aaa','bbb']
)。選擇刪除所有空白元素,然後再次將連接縫合起來。("aaa/bbb"
)
OR
你能做到這一點的枯燥方式:
require 'uri'
URI.join("http://www.host.com/aaa/bbb/ccc", "/ddd").to_s
# => "http://www.host.com/ddd"
URI.join("http://www.host.com/aaa/bbb/ccc", "ddd").to_s
# => "http://www.host.com/aaa/bbb/ddd"
給出代碼:
links.each{|link|
url = link['href'].nil? ? 'empty' : link['href']
if url.include? 'category' and !url.include? '/all'
links_array.push url
end
}
我會爲重新寫:
links.each do |link|
url = link['href'].nil? ? 'empty' : link['href']
if url.include? 'category' && !url.include? '/all'
full_url = URI.join(PAGE_URL, url).to_s
puts full_url
links_array << url
puts links_array.inspect
end
end
注意:S在多態方面,多行塊應該使用do/end而不是{}。縮進應該是兩個空格。圓括號內不應有空格。運營商比推送更受青睞。始終使用& &在條件語句而不是and
,它具有低得多的優先級,並可能導致的問題。見GitHub的風格指南:
https://github.com/styleguide/ruby
的puts
是根據您的意見還有,希望幫助你弄清楚爲什麼你的陣列是不是行爲。它應該是,根據你放在那裏的代碼。我寧願使用調試器寶石。 (或者,如果你對Ruby的2.X byebug)
你可以使用正則表達式來檢查完全合格的URL,類似於/^[\ w] *:\/\ // - 如果它匹配,那麼前插根URL。在相對URL表示,它開始在服務器後的根路徑,而不是開始沒有斜線相對鏈接,匹配當前頁的目錄當中開始記住的「/」的精妙之處。我會寫一個答案,但我需要更多關於可用變量的知識。 (主要是當前完全限定的URL和當前頁面路徑。) – 2014-08-27 11:17:38
編輯添加變量! – James 2014-08-27 13:58:42