Ich habe die Kommentarfunktion (Kommentar) implementiert, indem ich Ajax verwendet habe, um einen Teilübergang durchzuführen. Ich werde den Stolperstein bei der Implementierung der Update-Funktion verlassen.
Ruby 2.7.2 Rails 6.0.3.4
Aktualisieren Sie den Inhalt (Text) des Kommentars (Kommentars), der dem Beitrag zugeordnet ist. Der Controller sieht so aus.
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
Der js-Code sieht so aus.
comment_edit.js
$(function() {
//Auszug
$.ajax({
type: 'PATCH',
url: '/comments/' + commentId,
data: {
comment: {
body: body
},
},
dataType: 'json',
}).done(function (data) {
//Erfolgsabwicklung
}).fail(function () {
//Fehlerbehandlung
});
})
});
Wenn die Kommentaraktualisierung erfolgreich ist, wird der Erfolgsprozess ausgeführt. Ich habe jedoch einen 422-Fehler erhalten. Als ich das Rails-Protokoll überprüfte, war es wie folgt.
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):
Es heißt "CSRF-Token-Authentizität kann nicht überprüft werden". Anscheinend war die Ursache, dass das CSRF-Token nicht gewährt wurde.
Ich habe csrf_meta_tags
in application.html.erb
erwähnt.
ruby:application.html.erb
<!DOCTYPE html>
<html>
<head>
<title>Titel</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>
Es scheint als Gegenmaßnahme für CSRF beschrieben zu werden. Weitere Informationen finden Sie im Rails Guide. Rails Security Guide
Auf dieser Grundlage haben wir den folgenden Code in Form der Gewährung eines CSRF-Tokens hinzugefügt.
comment_edit.js
$(function() {
//Auszug
$.ajax({
type: 'PATCH',
url: '/comments/' + commentId,
data: {
comment: {
body: body
},
},
//Nachtrag von hier
headers: {
'X-CSRF-Token' : $('meta[name="csrf-token"]').attr('content')
},
//Nachtrag bis hierher
dataType: 'json',
}).done(function (data) {
//Erfolgsabwicklung
}).fail(function () {
//Fehlerbehandlung
});
})
});
Dann hat es gut funktioniert.
Der PC ist ehrlich. Ich bekomme nur das, wozu ich angewiesen wurde (lacht)
Ich denke, es gibt andere Möglichkeiten, es zu schreiben. Möglicherweise möchten Sie die unten stehende Rails-Anleitung lesen. [Ajax CSRF-Token für Rails Guide](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