Повторное использование одного файла с базовым кодом, проверенным на Ruby, в рельсах? - PullRequest
1 голос
/ 06 августа 2009

Я получил этот код в одном файле snippet.rb, и он работает как положено. Этот скрипт из фрагмента dzone, который извлекает миниатюру URL в текущий момент времени.

Теперь я хочу интегрировать эту функциональность с Rails, и здесь я застрял, как начать. Должен ли я поместить это в какой-нибудь файл ruby ​​в каталоге lib или сделать его модулями ??? Я не очень хорошо разбираюсь в Ruby, так что кто-нибудь может предложить мне, как и с чего начать ??

    require 'net/http'
    require 'rubygems'
    require 'xmlsimple'

    class Nailer

        @@api_baseurl = 'http://webthumb.bluga.net/api.php'
        @@api_key = 'YOUR-API-KEY'

        attr_accessor :collection_time, :job_id, :ok

        def initialize(url, width = 1024, height = 768)
            url = url.gsub!(/&/, '&')
            api_request = 
    %Q{<webthumb><apikey>#{@@api_key}</apikey><request><url>#{url}</url><width>#{width}</width><height>#{height}</height></request></webthumb>}

            result = do_request(api_request)

            if result.class == Net::HTTPOK
              result_data = XmlSimple.xml_in(result.body)
              @job_id = result_data['jobs'].first['job'].first['content']
              @collection_time = Time.now.to_i + result_data['jobs'].first['job'].first['estimate'].to_i
              @ok = true
            else
              @ok = false
            end
        end

        def retrieve(size = :small)
            api_request = 
    %Q{<webthumb><apikey>#{@@api_key}</apikey><fetch><job>#{@job_id}</job><size>#{size.to_s}</size></fetch></webthumb>}
            result = do_request(api_request)
            result.body
        end

        def retrieve_to_file(filename, size = :small)
            File.new(filename, 'w+').write(retrieve(size.to_s))
        end

        def ready?
            return unless Time.now.to_i >= @collection_time

            api_request = %Q{<webthumb><apikey>#{@@api_key}</apikey><status><job>#{@job_id}</job></status></webthumb>}
            result = do_request(api_request)

            if result.class == Net::HTTPOK
              @ok = true
              result_data = XmlSimple.xml_in(result.body)
              begin
                @result_url = result_data['jobStatus'].first['status'].first['pickup']
                @completion_time = result_data['jobStatus'].first['status'].first['completionTime']
              rescue
                @collection_time += 60 
                  return false
              end
            else
              @ok = false
            end

            true
        end

        def ok?
            @ok == true
        end

        def wait_until_ready
            sleep 1 until ready?
        end

        private

        def do_request(body)
            api_url = URI.parse(@@api_baseurl)
            request = Net::HTTP::Post.new(api_url.path)
            request.body = body
            Net::HTTP.new(api_url.host, api_url.port).start {|h| h.request(request) }
        end
    end

    url = 'http://www.rubyinside.com/'
    t = Nailer.new(url)

    if t.ok?
        t.wait_until_ready
        t.retrieve_to_file('out1.jpg', :small)
        t.retrieve_to_file('out2.jpg', :medium)
        t.retrieve_to_file('out3.jpg', :medium2)
        t.retrieve_to_file('out4.jpg', :large)
        puts "Thumbnails saved"
    else
        puts "Error"
    end

Ответы [ 3 ]

3 голосов
/ 06 августа 2009

Поместите это в lib/nailer.rb, и все готово. Автозагрузка Rails позволяет вам использовать Nailer.new(...) и тому подобное без каких-либо настроек или требований.

0 голосов
/ 06 августа 2009

Похоже, вы можете просто вставить это прямо в вашу директорию lib / в файле с именем nailer.rb, и у вас все получится. Поскольку lib / находится в вашем пути загрузки в приложении Rails, простой "require 'nailer'" в верхней части любого данного файла должен быть всем, что вам нужно, чтобы вытянуть класс в ваше пространство имен.

Вы могли бы также поместить его в приложение / модели - вполне нормально размещать там модели, не относящиеся к ActiveRecord. Поскольку это не совсем модель данных в вашем домене, я думаю, что lib /, вероятно, лучше.

0 голосов
/ 06 августа 2009

Каталог lib - хорошее место для такого кода утилиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...