Rails ActionController未知格式

Sea*_*eal 8 ruby ruby-on-rails actioncontroller axlsx

我正在尝试渲染xlsx文件.但我一直在接受406/UnknowFormat.我做了正确的设置,也许我错过了什么?

Rails 4.2 app

gem 'axlsx'
gem "axlsx_rails"
gem 'zip-zip'
Run Code Online (Sandbox Code Playgroud)

配置/初始化/ MIME

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

调节器

respond_to do |format|
      format.xlsx { render xlsx: "create", template: "api/reports/create" }
end
Run Code Online (Sandbox Code Playgroud)

意见/ API /报告/ create.xlsx.axlsx

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

Pat*_*206 10

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

some_controller.rb

def create_report
  render "template_path/report.xlsx.axlsx"
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Fre*_*ung 5

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

如果看起来只有一种你想渲染的格式,那么根本就不需要使用respond_to- 只需用整个东西替换即可

render xlsx: "create", template: "api/reports/create"
Run Code Online (Sandbox Code Playgroud)

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