Rails ActionController 未知格式

Rails ActionController unknown format

我正在尝试渲染 xlsx 文件。但我一直收到 406/UnknowFormat。我已经完成了正确的设置,也许我遗漏了什么?

Rails 4.2 应用

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

config/initializers/mime

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

控制器

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

views/api/reports/create.xlsx.axlsx

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

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

如果看起来只有一种格式,那么您根本不需要使用 respond_to - 只需将整个内容替换为

render xlsx: "create", template: "api/reports/create"

Rails 从 url 和 Accept header 的扩展中导出它认为可接受的格式。格式协商通常通过扩展比接受 header 简单地完成 - 链接(或发布)到 /some/path.xlsx 应该将格式设置为 xlsx。您可以通过在传递给路径助手的选项中包含 format: 'xlsx' 或作为路由选项散列的一部分来执行此操作。

对我来说,在 Rails 4.2 中,我必须指定完整的模板文件名,包括扩展名。根据 axlsx_rails docs 语法在 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

好吧,我来晚了,OP 可能已经继续了,但是对于遇到这个问题的其他人来说,一个可能的解释可能是忘记在 link 本身中设置格式。例如,你需要在你的视图中做这样的事情:download_file_path(format: "xlsx")