Существует ли унифицированный способ получения содержимого в схеме URI file: // или http: // в Ruby? - PullRequest
4 голосов
/ 28 сентября 2011

Оказывается, библиотека Net :: HTTP не поддерживает загрузку локального файла через файл: //.Я хотел бы настроить загрузку содержимого из файла или удаленно, в зависимости от среды.

Существует ли стандартный способ Ruby для доступа к тому же типу или к запрету на сжатый код, который разветвляется?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Знаете ли вы о open-uri ?

require 'open-uri'

open("/home/me/file.txt") { |f| ... }
open("http://www.google.com") { |f| ... }

Таким образом, чтобы поддержать либо "http://", либо" file: // "в одном операторе, просто удалите" file ": // "от начала URI, если он присутствует (и нет необходимости выполнять какую-либо обработку для" http://"),, например, так:

uri = ...
open(uri.sub(%r{^file://}, ''))
1 голос
/ 26 февраля 2015

Вот некоторый экспериментальный код, который учит "open-uri" обрабатывать "файл:" URIs:

require 'open-uri'
require 'uri'

module URI

  class File < Generic
    def open(*args, &block)
      ::File.open(self.path, &block)
    end
  end

  @@schemes['FILE'] = File

end
0 голосов
/ 28 сентября 2011

Как отметил Бен Ли, open-uri - это путь сюда.Я также использовал его в сочетании с скрепкой для хранения ресурсов, связанных с моделями, что делает все невероятно простым.

require 'open-uri'
class SomeModel < ActiveRecord::Base
  attr_accessor :remote_url

  has_attached_file :resource # etc, etc.

  before_validation :get_remote_resource, :if => :remote_url_provided?

  validates_presence_of :remote_url, :if => :remote_url_provided?,
                                     :message => 'is invalid or missing'

  def get_remote_resource
    self.resource = SomeModel.download_remote_resource(self.remote_url)
  end

  def self.download_remote_resource (uri)
    io = open(URI.parse(uri))
    def io.original_filename; base_uri.path.split('/').last; end
    io.original_filename.blank? ? nil : io
    rescue 
  end
end

# SomeModel.new(:remote_url => 'http://www.google.com/').save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...