То, что вы пытаетесь сделать , возможно , но далеко не тривиально, и Rails не предлагает никакой встроенной поддержки для него. На самом деле вам нужно будет опуститься до уровня ОС, чтобы сделать это, и если у вас есть более одного физического сервера, это будет еще сложнее.
Во-первых, вы не можете сохранить соединение в сеансе. На самом деле вы не хотите хранить какой-либо объект Ruby в сеансе по многим причинам, включая, но не ограничиваясь:
- Некоторые типы объектов испытывают трудности с маршалированием / демаршалированием
- Развертывание может привести к поломке, если модель изменится, и у людей будут устаревшие материалы, сериализованные в их сеансе
- Если вы используете хранилище сеансов cookie, то у вас есть только 4k
Так что в общем случае вы когда-либо хотите помещать примитивы, такие как строки, числа и логические значения, в сессию.
Теперь, что касается FTP-соединения, это относится к категории вещей, которые нельзя сериализовать / не сериализовать надежно. Причина в том, что это не просто объект Ruby, но также открытый сокет, который будет закрыт, как только исходный объект будет собран мусором.
Таким образом, чтобы поддерживать постоянное FTP-соединение, оно не может быть сохранено в переменной экземпляра контроллера, так как экземпляр контроллера предоставляется для каждого запроса. Вы можете попытаться создать его где-нибудь за пределами экземпляра контроллера, но это может привести к утечкам памяти, если вы не очень осторожны в очистке соединений, и, кроме того, если у вас более одного экземпляра сервера приложений, вам также понадобится чтобы найти способ гарантировать, что пользователь обращается к одному и тому же экземпляру сервера приложений при каждом запросе, иначе он не сможет найти ловушку. Так что, в целом, поддержание открытого сеанса в процессе Ruby не является началом.
Что вам нужно сделать, так это открыть соединение в отдельном процессе, с которым может общаться любой из процессов ruby. Там действительно нет установленного и стандартного способа сделать это, вам придется свернуть свой собственный. Вы можете заглянуть в DRb , чтобы найти некоторые примитивы, которые вам понадобятся.