Короткий ответ
Вам необходимо добавить
DRb.start_service
к app.rb
, прежде чем пытаться сделать удаленный вызов.
Объяснение, если вы заинтересованы
Хэш Sinatra params создается со связанным блоком для обработки случая, когда ссылаются на отсутствующие ключи ( вот источник ).Это означает, что с ним связан объект Proc
.
Drb передает аргументы взад и вперед, сортируя их.Однако из Документы маршала :
Некоторые объекты не могут быть выгружены: если объекты, которые должны быть выгружены, включают в себя привязки, объекты процедур или методов, экземпляры класса IO или одиночные объектыбудет возникать ошибка TypeError.
Поэтому возникнут проблемы при попытке передать этот хэш параметров по проводам, поскольку он содержит недопустимый объект процедуры.
Теперь на Документация Drb :
Однако, если объект нельзя маршалировать, вместо него передается или возвращается ссылка dRuby на него.Это появится на удаленном конце как экземпляр DRbObject.Все методы, вызываемые на этом удаленном прокси, передаются локальному объекту, как описано в обсуждении DRbObjects.Это имеет семантику, аналогичную обычной передаче по ссылке в Ruby.
Хорошие новости, она все еще должна работать.Так что не так?Чуть дальше в документации по Drb мы находим это в примере кода:
# Start a local DRbServer to handle callbacks.
#
# Not necessary for this small example, but will be required
# as soon as we pass a non-marshallable object as an argument
# to a dRuby call.
DRb.start_service
Итак, похоже, что Drb пытается получить удаленную ссылку для объекта процедуры для передачи на сервер,но не может, так как нет службы Drb, настроенной на стороне клиента.
Оригинальный ответ
(Я оставлю это здесь, это может меня заинтересовать. Это была точка отдыха намой путь к выяснению всего этого. Это также возможное альтернативное решение. Интересно, что я теперь более осведомленный человек, которого я упомянул, по крайней мере, в отношении причины.)
Вот возможный обходной путь.Похоже, проблема в хэшах, созданных с помощью блока для обработки отсутствующих ключей (который хэш параметров Синатры равен ), поэтому вы можете извлечь содержимое хеша в новый.params.clone
и params.merge({})
оба, похоже, сохраняют процесс (вы можете проверить с помощью Hash#default_proc
), но {}.merge(params)
(или merge!
) дает вам хороший чистый хеш, который работает с Drb.
Итак, в этом примере сделайте следующее:
get("/params"){ SERVER.echo({}.merge params).inspect
Почему это происходит с Drb и хэшем с procs, и будет ли это самый простой или самый правильный обходной путь, я оставлюкто-то более знающий.