Skip to content

Instantly share code, notes, and snippets.

@elvisgiv
Last active April 30, 2018 09:44
Show Gist options
  • Save elvisgiv/a49206f7ef4cc08c1aed9a5beafa985f to your computer and use it in GitHub Desktop.
Save elvisgiv/a49206f7ef4cc08c1aed9a5beafa985f to your computer and use it in GitHub Desktop.

задача - загрузить файл (запись из базы данных) из браузера на диск

in routes.rb

  resources :project_proposals, only: [:index] do
    get "excel_download" # !!!
  end

in controller

  def lib
    Proposal::ProjectProposalService
  end
  
  def excel_download
    #
    lib.create_excel_file_if_not_exists(@item) # file, who we want download, should be on disk 
    # method for downloading file from browser
    send_file(
        @item.excel_filepath, # filepath
        filename: @item.excel_filename, # filename
        type: "application/xlsx" # type of file
    )
  end

in lib

  def self.create_excel_file_if_not_exists(obj)
    items_to_excel(obj) unless File.exist?(obj.excel_filepath)
  end
  # creating excel file on disk for row from db
  def self.items_to_excel(obj)
    #
    Axlsx::Package.new do |p|
      p.workbook.add_worksheet(:name => "Project_proposals") do |sheet|
        sheet.add_row [I18n.t('project_proposals.date'), obj['created_at']]
        ProjectProposal::FIELDS_BASIC.each do |t|
          # row
          sheet.add_row [I18n.t('project_proposals.field.' + t), obj[t]]
        end
        sheet.add_row [I18n.t('project_proposals.field.email'), obj['email']]
        sheet.add_row [I18n.t('project_proposals.field.firstname'), obj['firstname']]

      end
      #
      p.serialize(obj.excel_filepath)
    end
  end

in view

  ...
  = link_to "download", project_proposal_excel_download_url(project_proposal_id: item.id)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment