9

I am trying to render a xlsx file. But I keep getting a 406/UnknowFormat. I have done the right setup, maybe im missing something?

Rails 4.2 app

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

config/initializers/mime

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

controller

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
Seal
  • 1,060
  • 1
  • 12
  • 31
  • try this `format.xlsx { render xlsx: "create", filename: "api/reports/create.xlsx" }` – Pardeep Saini Oct 29 '15 at 13:01
  • Nope still got `Completed 406 Not Acceptable in 10038ms ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/api/reports_controller.rb:12:in 'create'` – Seal Oct 29 '15 at 13:05
  • Try restarting your server. – Pardeep Saini Oct 29 '15 at 13:06
  • that was the first thing I had done lol – Seal Oct 29 '15 at 13:25
  • Have you tried setting the name via header? https://github.com/straydogstudio/axlsx_rails#file-name – Yaro Holodiuk Oct 29 '15 at 13:38
  • Im not sure thats relevant to the issue. For some reason ActionController is not able to find the xlsx format, that would be for sneding the file or downloading it, its not even getting to that point :( – Seal Oct 29 '15 at 13:43
  • For what it is worth, `axlsx_rails` defines the xlsx mime type. You shouldn't have to. – noel Oct 30 '15 at 14:54
  • Couple of quick questions: - 1. Could you please post the view code that hits that route please. 2. why do you have axlsx and axlsx_rails in your gemfile? axlsx is a dependency of axlsx_rails, so just axlsx_rails should be sufficient if I understand what you are trying to do here. – randym Oct 30 '15 at 16:34

3 Answers3

11

For me, in Rails 4.2 I had to specify the full template filename including extension. According to the axlsx_rails docs the syntax is different in Rails 4.2. Here's what worked for me:

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
Patrick G.
  • 697
  • 7
  • 13
  • 1
    For Rails 4.2, I got away with just typing in the file extension ... `render xlsx: 'report_evals_by_supvr.xlsx.axlsx'` or `render 'report_evals_by_supvr.xlsx.axlsx'` worked for me. – Chris Feb 22 '17 at 20:13
8

The error you are getting doesn't mean that rails didn't find the the xlsx format: it means that it compared the list of formats you're providing (i.e. just xlsx) and compared it to the set of formats it thinks the browser is willing to accept and didn't find any overlap.

If as it appears there is only one format you want to render then you don't need to use respond_to at all - just replace the whole thing with

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

Rails derives what it thinks are acceptable formats from the extension on the url and the Accept header. Format negotiation is generally simply done via the extension than the Accept header - linking (or posting) to /some/path.xlsx should set the format to xlsx. You can do this by including format: 'xlsx' in the options you pass to path helpers or as part of a hash of routing options.

Frederick Cheung
  • 83,189
  • 8
  • 152
  • 174
  • `axlsx_rails` used to add `xlsx` to the available formats array if it was missing. This would allow you to serve `xlsx` even if the url didn't have the right extension. This became very troublesome with Rails 4 and it was removed. So the problem with `respond_to` probably comes from not having the `xlsx` extension in the requesting url. – noel Oct 30 '15 at 14:58
2

Well I am really late here, and the OP has probably moved on, but for others who've happened onto this problem, a possible explanation might be forgetting to set the format in the link itself. For example, you'd need to do something like this in your view: download_file_path(format: "xlsx")

kindofgreat
  • 870
  • 8
  • 16