Rails ActionController unknown format

14,032

Solution 1

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.

Solution 2

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

Solution 3

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")

Share:
14,032
Seal
Author by

Seal

MEEEEEOOOOOOOOOOOWWWWWWWWWWWWWWW!

Updated on June 25, 2022

Comments

  • Seal
    Seal almost 2 years

    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
    
  • noel
    noel over 8 years
    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.
  • Chris
    Chris about 7 years
    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.
  • bkunzi01
    bkunzi01 over 4 years
    This was the issue for me. Thanks.