2012-01-20 36 views
0

對不起,如果這個問題已被其他地方回答,但我已經花了一段時間看沒有運氣。鏈接到用戶指定的網址解釋爲相對URL

在我的網絡應用程序中,我要求用戶指定他們的博客的URL。但是,他們並不總是在這些網址的開頭放置「http://」。在網站的其他地方,當我鏈接到這些網址時,瀏覽器會將它們解釋爲相關網址。例如如果用戶寫入bobsblog.wordpress.com,則鏈接轉到http://www.mydomain.com/bobsblog.wordpress.com

一種解決方案是預先使用「http://」填充url字段。

但一個更好的解決方案是解析url並添加該方案,如果用戶沒有。軌道提供了一個很好的方法來做到這一點?我查看了函數URI :: parse,但似乎並沒有提供這樣做的好方法。

回答

1

你可以使用URI.parse並檢查方案。

before_save :sanitize_url 

def sanitize_url 
    uri = URI.parse(url) 
    self.url = "http://#{url}" if uri.scheme.blank? 
rescue URI::InvalidURIError => e 
    # not a parseable URI, so you need to handle that 
end 

這裏是一些輸出

ree-1.8.7-2011.03 :035 > x = URI.parse "http://google.com" 
=> #<URI::HTTP:0x1069720c8 URL:http://google.com> 
ree-1.8.7-2011.03 :036 > x.scheme 
=> "http" 
ree-1.8.7-2011.03 :037 > y = URI.parse "google.com" 
=> #<URI::Generic:0x1069672e0 URL:google.com> 
ree-1.8.7-2011.03 :038 > y.scheme 
=> nil 
ree-1.8.7-2011.03 :039 > z = URI.parse "https://google.com" 
=> #<URI::HTTPS:0x10695b8f0 URL:https://google.com> 
ree-1.8.7-2011.03 :040 > z.scheme 
=> "https" 
0

也許在你的模型中,你可以有一個方法將URL作爲絕對URL返回。如果它不以「http://」開頭,只需將它添加到前面。

def abs_url 
    (url.start_with? "http://") ? url : ("http://" + url) 
end 

而且在你看來,只是這樣做@user.abs_url


編輯:哦,我不知道,但你可能想這樣做在提交。類似的邏輯可以在保存之前完成。在這種情況下:

before_save :abs_url 
... 
def abs_url 
    url = (url.start_with? "http://") ? url : ("http://" + url) 
end 

並且該URL將與前面的「http://」一起保存。

+0

非常感謝!它也發生在我身上,開始「https://」的網址也是可以的(並且不需要http://前綴)。 –