Rails 2.3.14: Как сериализовать объект ActionController :: Request? - PullRequest
4 голосов
/ 30 сентября 2011

Мне нужно написать несколько методов, которые делают вещи, основываясь на типе объекта запроса, полученного контроллером Rails 2.3.14. Однако я не хочу запускать все приложение или даже контроллер; Я хотел бы иметь только маршаллированную копию такого объекта, с которой я могу работать вне среды Rails.

К сожалению, ActionController::Request объекты, передаваемые в контроллеры, содержат в глубине своей кишки Proc объекты, которые по своей природе не могут быть сериализованы.

Кто-нибудь знает способ сериализации одного из этих объектов, чтобы я мог сохранить его в файле данных и воссоздать его в другом сценарии? Я бы предпочел не монтировать патч класса Proc для предоставления метода #marshal_dump.

Спасибо!

1 Ответ

1 голос
/ 30 июля 2013

Хитрость заключается в замене / удалении несериализуемых объектов (особенно в env-hash).Я реализовал части этого в этот SO ответ .Я немного обновил свой подход, используя объект 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)

Обновление : теперь я только что видел, что вы спрашиваете vor Rails 2.3.14.Мой визуальный фильтр позволил мне увидеть 3.2.14.Так что это работает только для текущей версии рельсов, извините.

...