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