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