CSV рендерится в режиме Safari, но я хочу загрузить файл - PullRequest
5 голосов
/ 06 июля 2011

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

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 отображается как представление: как я могу изменить это и заставить его загружать как файл?

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

enter image description here

Ответы [ 2 ]

10 голосов
/ 06 июля 2011

Попробуйте

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"
0 голосов
/ 06 июля 2011

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

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