ActionController:: Unknown Format

dans mon application rails j'ai une requête ajax au serveur, pour stocker quelques données. Cette habitude de travailler sans aucun problème, mais maintenant j'ai 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 le type de données do être 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

fonction.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)
34
demandé sur sealocal 2014-04-08 21:15:05

5 réponses

mise à Jour create action 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 anot spécifiant le formatnew la page est rendue. Par conséquent, l'erreur ActionController::UnknownFormat .

38
répondu Kirti Thorat 2017-01-20 10:39:19

vous pouvez aussi modifier votre config/routes.rb fichier de la forme:

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

qui va par défaut le format à json. Il fonctionne très bien pour moi dans les Rails 4.

Ou si vous voulez aller encore plus loin et que vous utilisez les espaces de noms, vous pouvez couper les doublons:

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

avec le au-dessus de tout sous /api sera formaté comme json par défaut.

22
répondu BPH 2016-01-08 15:10:46

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

puis j'ai eu un autre message d'erreur(voir ci-dessous)

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

1
répondu Douglas G. Allen 2015-02-07 21:27:42

ce problème est arrivé avec moi et sovled par Juste ajouter

 respond_to :html, :json

pour ApplicationController fichier

Vous pouvez Vérifier l'Concevoir des questions sur Github: https://github.com/plataformatec/devise/issues/2667

1
répondu Abdallah Okasha 2017-06-18 12:47:02

il y a un autre scénario où cette question se reproduit (comme dans mon cas). Lorsque la requête CLIENT ne contient pas la bonne extension sur l'url, le contrôleur ne peut pas identifier le format de résultat désiré.

par exemple: le controller est défini à respond_to :json (en option simple, sans réponse HTML)- alors que l'appel client est défini à /reservations au lieu de /reservations.json.

au bout du compte, changez l'appel du client en /reservations.json.

1
répondu orberkov 2018-04-01 05:03:46