如何在rails中访问原始请求并稍后在rails中重新实例化请求?

时间:2012-05-29 13:21:30

标签: ruby-on-rails http

我想在将文件上传转换为临时文件之前访问请求对象,并将其添加到队列中以便稍后处理,主要是因为IO对象无法编组或序列化。我怎么能这样做?

我还需要在稍后“重做”请求。在rails请求生命周期的什么时候我会挂钩来做这个?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我不知道这有多可行,但我会使用机架中间件。

答案 2 :(得分:1)

嗯,要做到这一点,你不要做那样复杂的事情。

如果您想在后台流程中上传,只需使用delayed_paperclip即可。此gem使用delayed_job并在后台进程中处理上传,调整大小,发送到s3(如果需要)。