2017-08-06 37 views
0

目前我只允許用戶將鏈接插入到外部圖像。由於這個原因,如果用戶輸入一個像'1'這樣的虛假網址,任何引用資產管道的內容都會中斷。Rails - 有效圖像。如果有效,僅捕獲名稱

我解決了這個問題上的看法級別通過使用這個輔助

def remote_image_exists?(url) 
    url = URI.parse(url) 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = (url.scheme == 'https') 

    http.start do |http| 
     return http.head(url.request_uri)['Content-Type'].start_with? 'image' 
    end 
    end 

但這提交過程中沒有解決它(我可能會使用表單提交中這個助手的好)。

我試圖找到適當的方式來做到這一點(如果有?)然後一旦鏈接有效,有沒有辦法讓它是'當前'的名字?例如,自然文件的名稱? (也就是說,如果我下載它,默認文件的名稱)。

最終結果

由於所選擇的答案,我能夠在我想用邏輯決定。

def remote_image_exists?(url) 
    url = URI.parse(url) 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = (url.scheme == 'https') 

    http.start do |http| 
     return http.head(url.request_uri)['Content-Type'].start_with? 'image' 
    end 
    end 

    def get_file_name(url) 
    if remote_image_exists?(url) 
     current_name = File.basename(URI.parse(url).path) 
     return current_name 
    else 
     return nil 
    end 
    end 

由於需求是雙面的,我不想把它變成單一的方法。

回答

1

對於你的第一個問題,你是在正確的軌道上。在用戶提交鏈接以獲取UI級別驗證之後,讓服務器執行任何實際工作之前,請將您的幫助器作爲custom validation的一部分調用。

您的幫手已經包含第二個問題的部分解決方案。使用文件庫,你可以提取一個URL文件的basename像這樣:

current_name = File.basename(URI.parse(url).path) 

有一件事你可能想在你的助手進行修改,但是,是利用所謂url一個局部變量和方法ARG調用的url爲了清楚起見,以防萬一您想要在方法中第二次使用傳入的參數。

+0

感謝您的信息。這很有幫助。然而,你提供這個,導致我徹底改變了我的問題的範圍(而不是如何實現你的建議)。如果您可以查看它,我將不勝感激。 – DNorthrup

+0

請不要改變你的問題。堆棧溢出基於「一個問題,一個被接受的答案範式」,這意味着它在處理後續問題方面很差,並且已經編輯過的問題使得答案或多或少毫無意義。對於那些志願花時間爲你挑戰一個移動目標的人來說,這太過分了。如果您有更多問題,只需將它們作爲單獨的問題發佈。另外,請閱讀[XY問題](http://xyproblem.info/)。在拉他人幫忙之前,要仔細想想你真正想要什麼。 – MarsAtomic

+0

這很公平。我將重新提出我的問題,並將其標記爲完整。 – DNorthrup