module Avv2word class Renderer class << self def send_file(context, filename, options = {}) new(context, filename, options).send_file end end def initialize(context, filename, options) @word_template = options[:word_template].presence @disposition = options.fetch(:disposition, 'attachment') @use_extras = options.fetch(:extras, false) @file_name = file_name(filename, options) @context = context define_template(filename, options) @content = options[:content] || @context.render_to_string(options) end def send_file document = Avv2word::Document.create(@content, @word_template, @use_extras) @context.send_data(document, filename: @file_name, type: Mime[:docx], disposition: @disposition) end private def define_template(filename, options) if options[:template] == @context.action_name if filename =~ %r{^([^\/]+)/(.+)$} options[:prefixes] ||= [] options[:prefixes].unshift $1 options[:template] = $2 else options[:template] = filename end end end def file_name(filename, options) name = options[:filename].presence || filename name =~ /\.docx$/ ? name : "#{name}.docx" end end end