我需要根据Rails 2.3.14控制器收到的请求对象的类型编写一些Do Things方法。但是,我不想启动整个应用程序,甚至也不需要控制器;我想只有一个这样的对象的编组副本,我可以在Rails环境之外使用。
不幸的是,传递给控制器的ActionController::Request
对象在其内部深处包含Proc
对象,这些对象本质上是不可序的。
有没有人知道如何序列化其中一个对象,以便将其存储在数据文件中并在另一个脚本中重新创建?我宁愿不对Proc
类进行修补以提供#marshal_dump
方法..
谢谢!
答案 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版本,抱歉。