Загрузите zip-файл из пакетного действия activeadmin - PullRequest
0 голосов
/ 31 августа 2018

Я хочу send_data для администратора, который использует интерфейс activeadmin на нашем сайте. Эти данные представляют собой ZIP-файл и могут быть загружены при соблюдении определенных условий для выбранных элементов.

Я создал сервис, который обрабатывает логику (довольно сложную). Так что из activeadmin я могу позвонить:

batch_action :action_name, form: {selection: ['...']} do |ids, inputs|
  response = MyService.new(ids, inputs[:selection]).my_method
  redirect_to collection_path
end

В моем распоряжении MyService.rb:

...
def my_method
  ...
  if condition
    zip_data = Zip::OutputStream.write_buffer do |zip|
      zip.put_next_entry("#{original_file_name}.xml")
      zip << File.read(original_file)
    end
    send_data(zip_data.read, :type => 'application/zip', :filename => "#{original_file_name}.zip")
    # here send_data throws an error because it's a controller method
  else
    ...
  end
  ...
end
...

Но как правильно использовать метод send_data? Может быть, я должен что-то реструктурировать? Я знаю, что вы, вероятно, можете сделать ActionController::DataStreaming.send_data(...) вне контроллера, но это не рекомендуется для кода.

1 Ответ

0 голосов
/ 31 августа 2018

решаемая. Я поставил send_data в коде batch_action следующим образом:

batch_action :action_name, form: {selection: ['...']} do |ids, inputs|
  response = MyService.new(ids, inputs[:selection]).my_method
  redirect_to collection_path
  send_data(response[:zip][:data].read, :type => 'application/zip', :filename => "#{response[:zip][:name]}.zip") if response[:zip].present?
end

, где ответ содержит почтовые данные для отправки (которые необходимо перезаписать с помощью zip_data.rewind перед отправкой). my_service.rb теперь похоже на:

...
def my_method
  ...
  if condition
    zip_data = Zip::OutputStream.write_buffer do |zip|
      zip.put_next_entry("#{original_file_name}.xml")
      zip << File.read(original_file)
    end
    zip_data.rewind
    response[:zip] = {data: zip_data, name: original_file_name}
  else
    ...
  end
  ...
end
...
...