1

我在单个文件 snippet.rb 中得到了这段代码,它按预期运行。此脚本来自 dzone 片段,该片段在当前时间获取 URL 的缩略图。

现在我想将此功能与 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
4

3 回答 3

3

把它放进lib/nailer.rb去,你就可以走了。Rails 的自动加载功能让您Nailer.new(...)无需任何配置或要求即可使用等。

于 2009-08-05T21:46:09.567 回答
0

lib 目录是这样的实用程序代码的好地方。

于 2009-08-05T21:39:33.373 回答
0

在我看来,您可以直接将其放入您的 lib/ 目录中名为 nailer.rb 的文件中,您应该一切顺利。由于 lib/ 在 Rails 应用程序的加载路径中,"require 'nailer'"因此任何给定文件顶部的简单内容应该是您将类拉入名称空间所需的全部内容。

可以把它放在 app/models 中——把非 ActiveRecord 模型放在那里是完全可以的。不过,由于这不完全是您领域中的数据模型,我认为 lib/ 可能是更好的地方。

于 2009-08-05T21:44:55.797 回答