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 всегда называется идентификатором записи 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, я не думаю, что кто-то это заметит.

  • В качестве альтернативы вы можете использовать драгоценный камень, например act_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

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

  • Напишите свой собственный респондент / рендерер

axlsx_rails также является отличным примером того, как создать собственный рендерер и респондент, чтобы вы могли использовать стандартное представление 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