Rails 控制器未知格式

9

我尝试渲染一个 xlsx 文件,但是一直收到 406/UnknowFormat 的错误提示。我已经进行了正确的设置,可能是我错过了什么吗?

这是一个 Rails 4.2 应用程序。

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

views/api/reports/create.xlsx.axlsx

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

不行,仍然出现`在10038毫秒内完成406不可接受的请求ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/api/reports_controller.rb:12:in 'create'` - Seal
尝试重新启动您的服务器。 - Pardeep Saini
那是我做的第一件事,哈哈 - Seal
你尝试通过标头设置名称了吗?https://github.com/straydogstudio/axlsx_rails#file-name - Yaro Holodiuk
说实话,axlsx_rails 定义了 xlsx 的 mime 类型。你不需要自己定义。 - noel
显示剩余3条评论
4个回答

11

对于我来说,在Rails 4.2中,我必须指定完整的模板文件名,包括扩展名。 根据axlsx_rails文档,在Rails 4.2中语法是不同的。以下是对我有效的内容:

some_controller.rb

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

模板路径/report.xlsx.axlsx

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

1
对于Rails 4.2,我只需要输入文件扩展名即可... render xlsx: 'report_evals_by_supvr.xlsx.axlsx' 或者 render 'report_evals_by_supvr.xlsx.axlsx' 对我来说都可以。 - Chris

8
你遇到的错误并不意味着Rails没有找到xlsx格式。它比较了你提供的格式列表(即仅限xlsx)并将其与浏览器愿意接受的格式集合进行了比较,但没有找到任何重叠部分。
如果你只想呈现一种格式,那么根本不需要使用respond_to - 只需用以下代码替换整个内容:
render xlsx: "create", template: "api/reports/create"

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

axlsx_rails 用于将 xlsx 添加到可用格式数组中(如果该格式不存在)。这样即使请求 URL 没有正确的扩展名,也可以提供 xlsx。但是随着 Rails 4 的推出,这种方式变得非常麻烦,因此被删除了。所以 respond_to 的问题可能是由于请求 URL 中没有 xlsx 扩展名造成的。 - noel

2

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


该问题可能与链接的格式有关。在链接中设置正确的格式可以解决此问题。

1
这对我来说是个问题。谢谢。 - bkunzi01

0
如果您的控制器中只有format.xlsx,那么如果您要渲染一个页面并且您的xlsx文件是一个链接,那么添加format.html可能是解决方案。
respond_to do |format|
  format.html
  format.xlsx { ... }
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接