Rails 2.3.14:如何序列化ActionController :: Request对象?

时间:2011-09-29 22:35:11

标签: ruby-on-rails ruby serialization marshalling

我需要根据Rails 2.3.14控制器收到的请求对象的类型编写一些Do Things方法。但是,我不想启动整个应用程序,甚至也不需要控制器;我想只有一个这样的对象的编组副本,我可以在Rails环境之外使用。

不幸的是,传递给控制器​​的ActionController::Request对象在其内部深处包含Proc对象,这些对象本质上是不可序的。

有没有人知道如何序列化其中一个对象,以便将其存储在数据文件中并在另一个脚本中重新创建?我宁愿不对Proc类进行修补以提供#marshal_dump方法..

谢谢!

1 个答案:

答案 0 :(得分:1)

诀窍是替换/删除不可序列化的对象(特别是在env-hash中)。我在this SO answer中实现了部分内容。我使用rails 3.2.13 request对象略微更新了我的方法。

##
# build a serializable hash out of the given request object
def make_request_serializable(request)
  request_hash = {
    :env => request.env.clone,
    :filtered_parameters => request.filtered_parameters.clone,
    :fullpath => request.fullpath,
    :method => request.method,
    :request_method => request.request_method
  }
  #clean up the env-hash, as it contains not serializable objects
  request_hash[:env].tap do |env|
    env.delete "action_dispatch.routes"
    env.delete "action_dispatch.logger"
    env.delete "action_controller.instance"
    env.delete "rack.errors"
    env["action_dispatch.remote_ip"] = env["action_dispatch.remote_ip"].to_s 
  end
  request_hash
end

# later in the controller
puts make_request_serializable(request).to_json
#=> {"env":{"SERVER_SOFTWARE":"thin 1.5.1 codename Straight Razor","SERVER_NAME":"localhost","rack.input":[],"rack.version":[1,0], ... (shortened, as it's a lot of output)

更新:owww,我刚刚看到你问vor Rails 2.3.14。我的视觉过滤器让我看到了3.2.14。所以这只适用于当前的rails版本,抱歉。