diff --git a/lib/comma.rb b/lib/comma.rb index 3d4130c..aea4f27 100644 --- a/lib/comma.rb +++ b/lib/comma.rb @@ -31,12 +31,12 @@ module Comma ActionController::Renderers.add :csv do |obj, options| filename = options[:filename] || 'data' extension = options[:extension] || 'csv' - mime_type = if Rails.version >= '5.0.0' options[:mime_type] || Mime[:csv] else options[:mime_type] || Mime::CSV end + with_bom = options.delete(:with_bom) || false # Capture any CSV optional settings passed to comma or comma specific options csv_options = options.slice(*CSV_HANDLER::DEFAULT_OPTIONS.merge(Comma::DEFAULT_OPTIONS).keys) @@ -50,6 +50,7 @@ module Comma end end data = obj.to_comma(csv_options) + data = "\xEF\xBB\xBF#{data}" if with_bom disposition = "attachment; filename=\"#{filename}.#{extension}\"" send_data data, type: mime_type, disposition: disposition end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 2fa25dd..8791a46 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -112,6 +112,18 @@ def get_(name, **args) expect(response.content_type).to eq 'text/plain' end + it 'should allow bom to be set' do + get_ :with_custom_options, format: :csv, params: { custom_options: { with_bom: true } } + + expected_content = <<-CSV.gsub(/^\s+/, '') + \xEF\xBB\xBFFirst name,Last name,Name + Fred,Flintstone,Fred Flintstone + Wilma,Flintstone,Wilma Flintstone + CSV + + expect(response.body). to eq expected_content + end + describe 'headers' do it 'should allow toggling on' do get_ :with_custom_options, format: :csv, params: { custom_options: { write_headers: 'true' } }