2016-12-14 3 views
0

Я пытался сохранить свои файлы изображений следующим образом в своем ActiveJob, но многие мои записи отображались как недействительные. Посмотрев, почему, похоже, удаленный url не находит правильное изображение и возвращает сообщение об ошибке 404. Как я могу изменить текущую настройку на (1) попытку получить изображение, (2), если это некорректная ссылка, а затем проигнорировать ее и сохранить запись - просто без картинки?Использование Carrierwave, как я могу убедиться, что удаленный URL-адрес действителен, прежде чем пытаться сохранить его в записи?

Моя текущая настройка ...

if self.headshot_url.present? 
    player_record.remote_headshot_image_url = self.headshot_url 
    if !player_record.valid? 
    player_record.remote_headshot_image_url = nil 
    end 
end 

ответ

1

Я часто использую драгоценный камень FastImage, чтобы быстро найти размер и тип изображения. Вы также можете использовать для проверки правильности изображения.

FastImage.type('https://github.com/sdsykes/fastimage') 
=> nil 

FastImage.type('https://www.google.ru/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png') 
=> :png 
2

Вы можете сделать HEAD HTTP-запрос на изображение URL, а также проверить заголовки ответа.

0

Рубин имеет stdlib HTTP library, что вы можете использовать:

uri = URI('http://example.com/some_path?query=string') 

Net::HTTP.start(uri.host, uri.port) do |http| 
    response = http.head('/') 
    if response.is_a?(Net::HTTPSuccess) 
    puts "Yay" 
    else 
    puts "Oh noes" 
    end 
end 

Чтобы создать проверку, которая проверяет, является ли URL действителен вы могли бы сделать:

require 'net/http' 
class Thing < ApplicationRecord 
    validates :headshot_url_must_be_valid, if: -> { headshot_url.present? } 

    def headshot_url_must_be_valid 
    uri = URI(headshot_url) 
    Net::HTTP.start(uri.host, uri.port) do |http| 
    response = http.head('/') 
    unless response.is_a?(Net::HTTPSuccess) 
     # This is how you would normally do validation 
     # errors.add(:headshot_url, "is invalid. #{res.code} - #{res.msg}") 
     self[:headshot_url] = nil 
    end 
    end 
    end 
end 
Смежные вопросы