2009-08-05 2 views
1

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

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

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 

ответ

0

Каталог lib является хорошим местом для кода полезности, подобного этому.

0

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

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

3

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

+0

Спасибо, я попробую и вернусь. – Autodidact