ruby-on-rails – Rails 2.3.14:如何序列化ActionController ::
发布时间:2020-12-17 02:00:12 所属栏目:百科 来源:网络整理
导读:我需要根据Rails 2.3.14控制器收到的请求对象的类型编写一些Do Things方法.但是,我不想启动整个应用程序,甚至也不需要控制器;我想只有一个这样的对象的编组副本,我可以在Rails环境之外工作. 不幸的是,传递给控制器??的ActionController :: Request对象在其内
我需要根据Rails 2.3.14控制器收到的请求对象的类型编写一些Do Things方法.但是,我不想启动整个应用程序,甚至也不需要控制器;我想只有一个这样的对象的编组副本,我可以在Rails环境之外工作.
不幸的是,传递给控制器??的ActionController :: Request对象在其内部深处包含Proc对象,这些对象本质上是不可序的. 有没有人知道一种方法来序列化这些对象之一,以便我可以将它存储在数据文件中并在另一个脚本中重新创建它?我宁愿不修补Proc类来提供#marshal_dump方法.. 谢谢! 解决方法
诀窍是替换/删除不可序列化的对象(特别是在env-hash中).我在
this SO answer中实现了部分内容.我使用rails 3.2.13请求对象略微更新了我的方法.
## # 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版本,抱歉. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |