【问题标题】:Download zip file from activeadmin batch action从 activeadmin 批处理操作下载 zip 文件
【发布时间】:2018-08-31 18:01:02
【问题描述】:

我想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(...),但为了代码,不建议这样做。

【问题讨论】:

    标签: ruby-on-rails download activeadmin


    【解决方案1】:

    解决了。我把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 数据(在发送之前需要使用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
    ...
    

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多