Rails ActionController未知格式

时间:2015-10-29 12:49:32

标签: ruby-on-rails ruby actioncontroller axlsx

我正在尝试呈现xlsx文件。但我一直在406/UnknowFormat。我做了正确的设置,也许我错过了什么?

Rails 4.2 app

gem 'axlsx'
gem "axlsx_rails"
gem 'zip-zip'

配置/初始化/ MIME

Mime::Type.register "application/xlsx", :xlsx

控制器

respond_to do |format|
      format.xlsx { render xlsx: "create", template: "api/reports/create" }
end

视图/ API /报告/ create.xlsx.axlsx

wb = xlsx_package.workbook
wb.add_worksheet(name: "Reports") do |sheet|
  sheet.add_row [@report_name]
end

3 个答案:

答案 0 :(得分:10)

对我来说,在Rails 4.2中我必须指定完整的模板文件名,包括扩展名。根据{{​​3}},Rails 4.2中的语法不同。这对我有用:

some_controller.rb

def create_report
  render "template_path/report.xlsx.axlsx"
end

template_path / report.xlsx.axlsx

wb = xlsx_package.workbook
wb.add_worksheet(:name => "Basic Worksheet") do |sheet|
  sheet.add_row ["First Column", "Second", "Third"]
end

答案 1 :(得分:5)

你得到的错误并不意味着rails没有找到xlsx格式:这意味着它比较了你提供的格式列表(即只是xlsx)并对它进行了比较它认为浏览器愿意接受并且没有找到任何重叠的格式集。

如果看起来只有一种您希望呈现的格式,那么您根本不需要使用respond_to - 只需用

替换整个内容
render xlsx: "create", template: "api/reports/create"

Rails从url和Accept标头的扩展名派生出它认为可接受的格式。格式协商通常只是通过扩展而不是Accept头完成 - 链接(或发布)到/some/path.xlsx应该将格式设置为xlsx。您可以通过在传递给路径助手的选项中包含format: 'xlsx'或作为路由选项哈希的一部分来实现此目的。

答案 2 :(得分:0)

我在这里真的很晚了,OP可能已经开始了,但是对于那些遇到过这个问题的人来说,可能的解释可能是忘记在链接本身设置格式。例如,您需要在视图中执行以下操作:download_file_path(format: "xlsx")