CSV отображается в представлении Safari, но я хочу, чтобы он загружал файл

Я настроил пользовательский тип mime:

ActionController::Renderers.add :csv do |csv, options|
  self.content_type ||= Mime::CSV
  self.response_body  = csv.respond_to?(:to_csv) ? csv.to_csv : csv
end

и блок response_to в моем контроллере:

respond_to do |format|
    format.html
    format.csv { render :csv => csv_code}
  end   

При использовании Firefox и Chrome файл .csv отображается в загружаемый файл. Используя Safari, .csv отображается как представление: как я могу изменить это и принудительно загрузить его в виде файла?

Смотрите скриншот проблемы:

введите здесь описание изображения


person JZ.    schedule 05.07.2011    source источник


Ответы (2)


Пытаться

respond_to do |format|
    format.html
    format.csv do
        response.headers['Content-Type'] = 'text/csv'
        response.headers['Content-Disposition'] = 'attachment; filename=thefile.csv'    
        render :csv => csv_code
    end
end 

если это не работает, попробуйте использовать

send_file "path/to/file.csv", :disposition => "attachment"
person Gal    schedule 05.07.2011

То, как я это делаю в старом приложении Rails 2, использует send_data вместо render в контроллере. Например.:

def csv
  ... # build data
  send_data csv_data_as_string, :filename => "#{filename}.csv", :type => 'text/csv'
end
person Jeremy Weathers    schedule 05.07.2011