skyksandr
@skyksandr
Full Stack Ruby on Rails Developer

RoR: Как реализовать временное хранение файла в кэше?

Здравствуйте, я новичок в RoR.

Задача, которую я пытаюсь решить, выглядит так:
1. Пользователь загружает xml файл
2. На стороне приложения я определяю сколько элементов в этом файле и предлагаю пользователю выбрать элемент для вывода, если их больше одного
3. После выбора элемента, если их было несколько производится запись данных в базу и на основании их формируется отчет.

Как бы я хотел это реализовать:
Static_pages#home -> elmts#choose_el -> Report для случая, если элементов несколько
Static_pages#home -> elmts#choose_el (но без открытия страницы) -> Report если элемент один

Вопрос мой заключается в том, как организовать передачу файла из контроллера elmts в контроллер с моделью Report?
Может быть, существует какое-либо временное хранилище (кэш), куда можно поместить файл и получить id и его уже передавать между контроллерами?

Дополнение:
Или, так как файлы xml хорошо сжимаются, а размер загружаемого файла вряд ли будет превышать 500 Кб - сжимать в zip, передавать в view и оттуда параметром в следующий контроллер?
  • Вопрос задан
  • 2660 просмотров
Решения вопроса 1
Able1991
@Able1991
Пишу на рельсах
Почему нужно хранить именно файл? храните данные в кеше,
key = UUID.generate.to_s
Rails.cache.write(key, тут xml)

Клиенту с обычным ответом отправляется ключь, по ключю потом вытаскивай

data = Rails.cache.read(params[:key])
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mastedm
@mastedm
А как вы файл аплодите? Если paperclip / carrierwave, то он у вас уже лежит на диске
Ответ написан
viktorvsk
@viktorvsk
Определенно создавайте модель XMLFile. Берите какой-нибудь пейперклип. Принимайте файл, сохраняйте на диск. Обрабатывайте необходимой логикой. Сохраняйте всю информацию (о файле, о пользователе и т.д., лишним никогда не бывает). Удаляйте хоть вручную (хранится все может в public), хоть по крону, хоть рейк-таском.

P.S. Возможно, XMLFile и избыточно. Но какая-то модель, обрабатывающая логику, необходима. Все зависит от конкретного случая. Не хочется модель-файл, делайте модель StaticPageHandler etc

P.S.S. Конечно, временный кэш вы можете организовать средствами Rails (gem dalli, memcached, или встроенное хранилище, или дисковое... (guides.rubyonrails.org/caching_with_rails.html) ). А передавать в view ничего не нужно. Просто кэш сохранять по ключу сессии пользователя
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы