J'ai implémenté la fonction de commentaire (comment) en utilisant ajax pour faire une transition partielle. Je laisserai la pierre d'achoppement lors de la mise en œuvre de la fonction de mise à jour.
Ruby 2.7.2 Rails 6.0.3.4
Mettez à jour le contenu (corps) du commentaire (commentaire) associé à la publication. Le contrôleur ressemble à ceci.
comment_controller.rb
class CommentsController < ApplicationController
def update
@comment = current_user.comments.find(params[:id])
if @comment.update(comment_update_params)
render json: @comment , status: :ok
else
render json: { comment: @comment, errors: { messages: @comment.errors.full_messages } }, status: :bad_request
end
end
private
def comment_update_params
params.require(:comment).permit(:body)
end
end
Le code js ressemble à ceci.
comment_edit.js
$(function() {
//Extrait
$.ajax({
type: 'PATCH',
url: '/comments/' + commentId,
data: {
comment: {
body: body
},
},
dataType: 'json',
}).done(function (data) {
//Traitement réussi
}).fail(function () {
//Traitement des échecs
});
})
});
Si la mise à jour des commentaires réussit, le processus de réussite sera exécuté. Cependant, j'ai eu une erreur 422. Lorsque j'ai vérifié le journal Rails, c'était comme suit.
Processing by CommentsController#update as JSON
Parameters: {"comment"=>{"body"=>"Ah ah"}, "id"=>"36"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms | Allocations: 834)
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
Il dit "Impossible de vérifier l'authenticité du jeton CSRF". Apparemment, la cause était que le jeton CSRF n'avait pas été accordé.
J'ai mentionné csrf_meta_tags
dans application.html.erb
.
ruby:application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Titre</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
Il semble être décrit comme une contre-mesure pour le CSRF. Pour plus de détails, veuillez consulter le guide des rails. Guide de sécurité des rails
Sur cette base, nous avons ajouté le code suivant sous la forme d'octroi d'un jeton CSRF.
comment_edit.js
$(function() {
//Extrait
$.ajax({
type: 'PATCH',
url: '/comments/' + commentId,
data: {
comment: {
body: body
},
},
//Post-scriptum d'ici
headers: {
'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content')
},
//Postscript jusqu'à ici
dataType: 'json',
}).done(function (data) {
//Traitement réussi
}).fail(function () {
//Traitement des échecs
});
})
});
Ensuite, cela a bien fonctionné.
Le PC est honnête. Je ne reçois que ce que j'ai été chargé de faire (rires)
Je pense qu'il y a d'autres façons de l'écrire. Vous voudrez peut-être vous référer au guide Rails ci-dessous. [Rails Guide Ajax CSRF Token](https://railsguides.jp/working_with_javascript_in_rails.html#ajax%E3%81%AEcsrf%EF%BC%88cross-site-request-forgery%EF%BC%89%E3%83% 88% E3% 83% BC% E3% 82% AF% E3% 83% B3)
Recommended Posts