rails excel mime-type - как да променя името на файла по подразбиране?

Следях http://railscasts.com/episodes/362-exporting-csv-and-excel и настройте изтегляне на Excel в моето приложение Rails.

Кодът на контролера ми изглежда така:

  def show
    @project = Project.find(params[:id])
    @project.tasks.order(:name)
    respond_to do |format|
      format.html
      format.json { render json: @project }
      format.xls
    end
  end

и според мен създавам връзката за изтегляне на файла на Excel по следния начин:

.dl_xls= link_to "Download xls", url_for(:format => 'xls')

Сега генерираният excel файл винаги се нарича като id на записа Project, напр. 80.xls

Има ли някакъв начин да промените това поведение и да му дадете персонализирано име?

Благодаря ти..


person tmaximini    schedule 24.07.2012    source източник


Отговори (3)


Вярвам, че отговорът ви е тук: в релси, как да върнете записи като csv файл

Използвайте заглавки, за да зададете името на файла.

headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
person cutalion    schedule 24.07.2012
comment
благодаря, че го направи. току-що добавих горния цитиран ред в моя format.xls { ... } и той работи с посоченото име на файл. - person tmaximini; 24.07.2012
comment
Това работи за всеки тип визуализиран файл за изтегляне. Страхотен! - person Ruby Racer; 19.04.2015
comment
Бих искал да добавя, че името на файла трябва да включва и разширението (.xls в този случай) - person raquelhortab; 04.11.2019

def index
  @tabulars = Tabular.all
  filename = "data_users.xls"
  respond_to do |format|
    format.html
    format.xls { headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" }
  end
end

Тази връзка повече подробности променете името на файла excel

person akbarbin    schedule 19.05.2013
comment
Благодаря, спестявате времето ми. - person Jigar Bhatt; 30.10.2015

Очаквам това, което всъщност виждате там, да е името на изгледа без .erb, а не непременно действието на контролера.

Ако искате това ниво на контрол, има три неща, които можете да направите.

  • Използвайте извикването send_data от вашия контролер с данни, разделени с табулатори, както е показано в релсите, предадени с опцията filename:

e.g.

class ProductsController < ApplicationController
  def index
    @products = Product.order(:name)
    respond_to do |format|
      format.html
      format.csv { send_data @products.to_csv }
      format.xls { send_data @products.to_csv(col_sep: "\t"), filename: 'your_file_name.xls'}
    end
  end
end

Има проблеми с този подход, както и със стария подходящ език spreadsheetML, който railscast въвежда, но ако вашата потребителска база е заключена в MS-OFFICE, не мисля, че някой ще забележи.

  • Като алтернатива можете да използвате скъпоценен камък като acts_as_xlsx или axlsx_rails, които консумират скъпоценния камък axlsx. Тези инструменти генерират валидирани xlsx данни (известни също като Office Open XML / ECMA-376 - или това, което MS използва от Office 2007...) и имат доста добра оперативна съвместимост с друг модерен софтуер за електронни таблици като Numbers, GoogleDocs, LibraOffice. Сигурен съм, че сте забелязали всички коментари, свързани с това в railscast.

Знам, защото аз съм авторът или axlsx, и тези ограничения, както и липсата на стил, диаграми и валидиране, какво ме накара да авторствам axlsx на първо място.

Повече информация: axlsx: https://github.com/randym/axlsx

acts_as_xlsx: http://axlsx.blogspot.jp/2011/12/using-actsasxlsx-to-generate-excel-data.html

  • Напишете свой собствен отговор/изобразител

axlsx_rails също е чудесен пример за това как да създадете свой собствен рендър и отговор, така че да можете да използвате стандартния изглед на релси, но да преименувате файла, който се изтегля.

https://github.com/straydogstudio/axlsx_rails/blob/master/lib/axlsx_rails/action_controller.rb

person randym    schedule 24.07.2012
comment
благодаря за отговора, но не исках да отида по маршрута send_data - person tmaximini; 24.07.2012