J'utilise backbone.js et cela fonctionne très bien. mais les formulaires que je crée en tant que modèle javascript n'ont pas le jeton de protection rails csrf. Comment l'ajouter aux modèles que je crée en javascript ?
Réponses
Trop de publicités?La meilleure façon de résoudre ce problème, à l'intérieur du formulaire :
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
Mettre à jour:
Il semble que le form_authenticity_token
soit privé pour les contrôleurs dans les nouvelles versions de rails.
Si c'est le cas pour vous, ce que je suggère c'est : déclarer une variable dans un contrôleur comme :
@form_token = form_authenticity_token
et utilisez-le dans la vue que vous recherchez.
Si vous avez <%= csrf_meta_tag %>
dans votre mise en page quelque part et qui vous est accessible depuis le js, vous pouvez y accéder en utilisant $('meta[name="csrf-token"]')
Voir http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html pour une idée sur la façon de pirater le support csrf dans chaque demande de backbone
J'ai un formulaire dans un composant Vue dans une application Rails 6.
À ma grande surprise, il suffisait d'inclure une entrée masquée avec le nom authenticity_token
dans le modèle Vue et lors du chargement de la page, Rails a rempli la valeur avec un jeton de protection CSRF.
Par exemple
<template>
<div id="app">
<form
action="/submit"
method="post"
@submit.prevent="onSubmit"
>
<input
type="hidden"
name="authenticity_token"
value=""
>
<!-- rest of form -->
</form>
</div>
</template>
Ce qui est rendu comme :
<div id="app">
<form action="/submit" method="post">
<input type="hidden" name="authenticity_token" value="zl9PJiE...">
...
</form>
</div>
Vous pouvez ajouter le jeton csrf à chaque formulaire qui utilise 'post' ou 'delete'. Le voici en coffeescript :
$ ->
for f in $("form")
if f.method == 'post' or f.method == 'delete'
$(f).prepend("<input type='hidden' name='authenticity_token' value='" + token + "'>")
Assurez-vous d'avoir <%= csrf_meta_tags %> dans votre mise en page. Il devrait déjà être dans la mise en page "application" standard, mais ajoutez-le si vous utilisez une mise en page différente.