gem 'axlsx'
#../lib/proposal/project_proposal_service.rb
module Proposal
class ProjectProposalService
# the directory which contain .xlsx files
FILE_DIR = "tmp/excel_form/"
FILE_NAME = "_project_proposal"
EXCEL_EXTENTION = ".xlsx"
def self.get_or_create_dirname_of_excel_file
directory_name = FILE_DIR
Dir.mkdir(directory_name) unless Dir.exists?(directory_name)
directory_name
end
def self.get_filename(id, lang)
lang ? id.to_s + FILE_NAME + "_" + lang + EXCEL_EXTENTION :
id.to_s + FILE_NAME + EXCEL_EXTENTION
end
def self.get_filepath(filename)
directory_name = get_or_create_dirname_of_excel_file
#
File.join(Rails.root, directory_name, filename)
end
def self.items_to_excel(obj)
Axlsx::Package.new do |p|
p.workbook.add_worksheet(:name => "your_sheet_name_in_excel") do |sheet|
ARRAY_OF_YOUR_ROWS_NAMES.each do |t|
# row
sheet.add_row [t, obj[t]] # t - row name, obj[t] - row value
end
end
#
p.serialize(obj.excel_filepath)
end
end
...
end
end
class ProjectProposal < ActiveRecord::Base
def excel_filename
Proposal::ProjectProposalService.get_filename(self.id, self.lang)
end
def excel_filepath
filename = self.excel_filename
Proposal::ProjectProposalService.get_filepath(filename)
end
end
после сохранения записи в базе, вызывается метод lib.items_to_excel(@item)
#../app/controllers/project_proposals_controller.rb
class ProjectProposalsController < SiteBaseController
...
def model
ProjectProposal
end
def lib
Proposal::ProjectProposalService
end
def create
@item = model.new(contact_params)
@item.lang = params[:lang]
#
@res = @item.save
respond_to do |format|
if @res
...
lib.items_to_excel(@item) # invoke creating excel file on disk
...
end
end
end
...
private
def contact_params
params.require(:project_proposal).permit(
:email, :firstname, :lastname, :phone, :lang,
)
end
end