In my rails app I have a ajax request to the server, to store some data. This used to work without any problem, but now I get an error:
ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/reservations_controller.rb:45:in `create' As following is the controller and my javascript file where I declare the datatype do be JSON
class ReservationController < ApplicationController respond_to :html, :json def create ... respond_to do |format| if @reservation.save format.html do redirect_to '/' end format.json { render json: @reservation.to_json } else render 'new' end end # respond_to end # create end # ReservationController function.js
$.ajax({ url: url_link, dataType: 'json', type: 'POST', data: dataToSend }) The complete error log is:
Completed 406 Not Acceptable in 45ms ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/bookings_controller.rb:45:in `create' Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.5ms) Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms) Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms) Rendered /Users/tiagovieira/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (9.6ms) 17 Answers
Update the create action as below:
def create ... respond_to do |format| if @reservation.save format.html do redirect_to '/' end format.json { render json: @reservation.to_json } else format.html { render 'new'} ## Specify the format in which you are rendering "new" page format.json { render json: @reservation.errors } ## You might want to specify a json format as well end end end You are using respond_to method but anot specifying the format in which a new page is rendered. Hence, the error ActionController::UnknownFormat .
You can also modify your config/routes.rb file like:
get 'ajax/:action', to: 'ajax#:action', :defaults => { :format => 'json' } Which will default the format to json. It is working fine for me in Rails 4.
Or if you want to go even further and you are using namespaces, you can cut down the duplicates:
namespace :api, defaults: {format: 'json'} do #your controller routes here ... end with the above everything under /api will be formatted as json by default.
There is another scenario where this issue reproduces (as in my case). When THE CLIENT REQUEST doesn't contain the right extension on the url, the controller can't identify the desired result format.
For example: the controller is set to respond_to :json (as a single option, without a HTML response)- while the client call is set to /reservations instead of /reservations.json.
Bottom line, change the client call to /reservations.json.
This problem happened with me and sovled by just add
respond_to :html, :json to ApplicationController file
You can Check Devise issues on Github:
3Well I fond this post because I got a similar error. So I added the top line like in your controller respond_to :html, :json
then I got a different error(see below)
The controller-level respond_to' feature has been extracted to theresponders` gem. Add it to your Gemfile to continue using this feature: gem 'responders', '~> 2.0' Consult the Rails upgrade guide for details. But that had nothing to do with it.
I got this error when trying to render an XML response - I had to change my template name from index.html.erb to index.xml.erb and then it worked.
mine was fixed because i didnt have / / in the scope, i had this (getting error for json):
Rails.application.routes.draw do scope '(:base_url)', base_url: #{ENV.fetch('BASE_URL').to_s} do ... end end instead of this (fixed):
Rails.application.routes.draw do scope '(:base_url)', base_url: /#{ENV.fetch('BASE_URL').to_s}/ do ... end end