ActionController::InvalidAuthenticityToken lorsque désactiver JS/Ajax demande
J'ai deux formulaires avec option remote: true
; on envoie une requête Ajax create
action et l'autre envoie une requête Ajax destroy
action.
Tous les travaux des amendes lorsque le JavaScript est activé, mais si je désactive le JavaScript, puis je clique, j'obtiens cette erreur:
ActionController::InvalidAuthenticityToken PersonsController#create
Pourquoi cette erreur est affichée, et comment puis-je résoudre ce problème ?
note: je suis à l'aide de Rails 4
Mise à jour
Lorsque j'utilise une forme normale sans option remote: true
, rails insère automatiquement un champ caché pour un jeton d'authentification, mais lorsque j'utilise remote: true
dans mon formulaire il n'y a pas de terrain dans le code HTML. Il semble que lorsqu'il y a remote
option, puis les Rails gère le jeton d'authentification différemment, alors, comment je peux obtenir que cela fonctionne dans les deux cas?
- medBo, vérifiez si votre formulaire a
csrf
jeton à l'intérieur dans la sortie html. Si non, que peut-être la raison. - il n'y a pas de jeton csrf à l'intérieur html de la forme ! je suis à l'aide de rails 4 je pense que c'est par la conception ? ou quoi ?
- medBo, vérifier ma mise à jour.
Vous devez vous connecter pour publier un commentaire.
Bizarrement, ce comportement a été modifié dans les rails 4. http://www.alfajango.com/blog/rails-4-whats-new/
Rails de formes aujourd'hui ne sera pas rendre les CSRF champ dans le formulaire, sauf si vous explicitement définir comme une option à votre formulaire:
L'ajout de cette option vous permet de dégrader gracieusement HTML de secours si le Javascript est désactivé.
authenticity_token: true
à labootstrap_form_for
appel, je reçois unUnknownFormat
d'erreur, ce qui signifie laremote: true
n'est plus reconnu. Auparavant, je n'ai pas eu leauthenticity_token: true
sur la forme et reçu le message d'erreur qui m'a conduit à ce post. Voulez-vous savoir pourquoi l'ajout de laauthenticity_token: true
à labootstrap_form_for
serait la cause de laremote: true
d'arrêter de travailler? Le formulaire a ladata-remote="true"
dans le code html, donc je ne suis pas sûr de ce que la question est ici:UnknownFormat
pointant vers monrepond_to do |format| format.js end
Moi aussi confronté au même problème. J'ai utilisé form_tag pour créer personnalisée à distance, mais j'ai l'erreur suivant,
J'ai trouvé que c'est parce que dans la glissière 4 l'habitude d'ajouter à l'authenticité de toke par défaut, j'ai donc ajouté la ligne suivante dans l'application.rb fichier,
qui vérifier automatiquement le toke, lors de la présentation de la télécommande formes. Cela résout le problème pour moi. Espérons que cela aidera quelqu'un.
config.action_view.embed_authenticity_token_in_remote_forms
vous permet de définir le comportement par défaut pour authenticity_token dans les formes avec :distance => true. Par défaut, il est défini à false, ce qui signifie que les formulaires ne comprennent authenticity_token, qui est utile lorsque vous êtes fragment de mise en cache de la forme. Distance formes obtenez de l'authenticité de la balise meta, de sorte que l'intégration est inutile à moins que vous prendre en charge les navigateurs sans JavaScript....Dans mon cas, j'ai juste eu à ajouter cette ligne dans ma page:
Si il n'y a pas de csrf champ(un champ caché) à l'intérieur de la forme, la présentation ne peut pas être authentifié par le serveur Rails.
Si vous faites le formulaire en
form_tag
, cette situation va se passer. La meilleure approche est d'utiliserform_for
pour une ressource(nouvel objet ou un objet existant en db) et csrf champ sera construit par les Rails automatiquement.