2012-05-29 47 views
2

我想在文件上傳被轉換爲臨時文件之前訪問請求對象,並將其添加到稍後處理的隊列中,這主要是因爲IO對象無法封送或序列化。我怎樣才能做到這一點?如何在rails中訪問原始請求並在稍後使用rails重新實例化請求?

我還需要稍後「重做」請求。在軌道請求生命週期的哪一點,我會鉤住這樣做?

+0

上傳nginx的/阿帕奇如果部署了妥善處理。所以我建議讀取文件和序列化/編組內容。所以與價值工作。我認爲你想要做什麼有更簡單的解決方案。 –

回答

1

我不知道這是多麼可行,但我會使用機架中間件。

+0

這就是我最終做的。我在我的答案中留下了代碼示例(在註釋 – quinn

+0

中似乎沒有效果,我很高興它爲您工作,並感謝分享您的解決方案。 – vise

1

那麼,只要做到這一點,你不要做那樣複雜的事情。

如果你想在後臺進程中上傳,你可以簡單地使用delayed_paperclip。這個寶石使用delayed_job和進程上傳,調整大小,發送到S3(如果你想)在後臺進程。

2

代碼示例,在routes.rb中:

post 'incoming_email' => Proc.new { |env| 
    RequestCache.create!(
    data: env['rack.input'].read, 
    content_type: env['CONTENT_TYPE'], 
    content_length: env['CONTENT_LENGTH'] 
) 

    [200, {'Content-Type' => 'text/plain'}, ['OK']] 
} 

,並在模型中:

class RequestCache < ActiveRecord::Base 
    attr_accessible :data, :content_length, :content_type 

    def params 
    Rack::Request.new({ 
     'rack.input' => StringIO.new(data), 
     'CONTENT_LENGTH' => content_length, 
     'CONTENT_TYPE' => content_type 
    }).POST 
    end 
end