web-dev-qa-db-fra.com

ActionController :: UnknownFormat

Dans mon Rails, j'ai une requête ajax auprès du serveur, destinée à stocker des données. Cela fonctionnait sans problème, mais je reçois maintenant une erreur:

ActionController::UnknownFormat (ActionController::UnknownFormat):
  app/controllers/reservations_controller.rb:45:in `create'

Comme suit est le contrôleur et mon fichier javascript où je déclare que le type de données est bien 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
      })

Le journal des erreurs complet est:

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)
42
tvieira

Mettez à jour l'action create comme ci-dessous:

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

Vous utilisez respond_to Méthode mais ne spécifiant pas le format dans lequel une page new est rendue. Par conséquent, l'erreur ActionController::UnknownFormat.

46
Kirti Thorat

Vous pouvez également modifier votre fichier config/routes.rb comme suit:

 get 'ajax/:action', to: 'ajax#:action', :defaults => { :format => 'json' }

Qui sera le format par défaut à JSON. Cela fonctionne très bien pour moi dans Rails 4.

Ou si vous voulez aller encore plus loin et que vous utilisez des espaces de noms, vous pouvez réduire les doublons:

namespace :api, defaults: {format: 'json'} do
   #your controller routes here ...
end

avec tout ce qui précède sous /api sera formaté en json par défaut.

24
BPH

Ce problème est arrivé avec moi et réglé par juste ajouter

 respond_to :html, :json

vers le fichier ApplicationController

Vous pouvez vérifier les problèmes de Devise sur Github: https://github.com/plataformatec/devise/issues/2667

3
Abdallah Okasha

Il existe un autre scénario dans lequel ce problème se reproduit (comme dans mon cas). Lorsque LA DEMANDE DU CLIENT ne contient pas l'extension appropriée dans l'URL, le contrôleur ne peut pas identifier le format de résultat souhaité.

Par exemple: le contrôleur est réglé sur respond_to :json (en tant qu’option unique, sans réponse HTML) - lorsque l’appel du client est défini sur /reservations au lieu de /reservations.json.

En bout de ligne, changez l’appel du client en /reservations.json.

2
orberkov

Eh bien, j'aime ce post parce que j'ai eu une erreur similaire. J'ai donc ajouté la première ligne, comme dans votre contrôleur, respond_to: html,: json

alors j'ai une erreur différente (voir ci-dessous)

Le joyau des répondeurs respond_to' feature has been extracted to the Au niveau du contrôleur. Ajoutez-le à votre Gemfile pour continuer à utiliser cette fonctionnalité: gem 'responders', '~> 2.0'. Consultez le guide de mise à niveau Rails) pour plus de détails. Mais cela n'a rien à voir avec cela.

1
Douglas G. Allen