2009-08-05 4 views
1

私はこのコードを単一のファイルsnippet.rbに入れて、期待通りに動作します。このスクリプトは、現時点でURLのサムネイルを取得するdzoneスニペットからのものです。ruby​​でテストされた基本的なコードを1つのファイルに再利用していますか?

今、私はこの機能をRailsと統合することにしました。ここでは始める方法がわかりません。 これをlibディレクトリの中のいくつかのrubyファイルに入れるか、それをモジュールにしますか? 私は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 

答えて

0

libディレクトリは、そのようなユーティリティコードのための良い場所です。

0

あなたはlib/nailer.rbというファイルのlib /ディレクトリにこれをまっすぐに置くことができます。 lib /はRailsアプリケーションのロードパスにあるので、与えられたファイルの一番上のシンプルな"require 'nailer'"は、あなたの名前空間にクラスを引き込むために必要なものでなければなりません。

もapp/modelsに入れることができます。ActiveRecord以外のモデルをそこに置くことは大丈夫です。これはまさにあなたのドメイン内のデータモデルではないので、lib /がおそらくより良い場所だと思います。

3

lib/nailer.rbに入れてください。 Railsのオートローディングでは、設定や必要なしにNailer.new(...)などを使用できます。

+0

ありがとう、私はそれを試して、戻ってきます。 – Autodidact

関連する問題