[RUBY] [Rails] Ich habe die Validierungsfehlermeldung mit asynchroner Kommunikation implementiert!

Ich bin ein Anfänger mit "super", der jeden Tag mit Rails zu kämpfen hat. Teilen Sie für die Organisation Ihres eigenen Wissens.

Einführung

Neulich habe ich gelernt, asynchrone Kommunikation in Rails zu implementieren, aber es gab einen Teil, den ich nicht vollständig verdaut hatte, also werde ich ihn ausgeben, um mein Verständnis zu vertiefen! Angenommen, eine Site veröffentlicht vom Benutzer empfohlene Bücher, können Sie die veröffentlichten Bücher kommentieren.

Wenn diesmal die Senden-Schaltfläche mit leerem Kommentarfeld gedrückt wird, wird die Fehlermeldung direkt über dem Kommentarfeld angezeigt und die Fehlermeldung selbst wird durch asynchrone Kommunikation implementiert. Lass uns schnell gehen!

Validierung

models/comment.rb


class BookComment < ApplicationRecord

  belongs_to :user  #Link zum Benutzermodell
  belongs_to :book  #Verknüpft mit dem Buchmodell

  validates :body, presence: true, length: {maximum: 150}
end

Durch Setzen von "Präsenz: Wahr" im Kommentarmodell ist das Posten im Leerzeichen verboten. Übrigens ist auch Länge: {Maximum: 150} eingestellt.

Lassen Sie uns gleich den Controller überprüfen!

Kommentare Controller

comments_controller.rb


class BookCommentsController < ApplicationController
  before_action :authenticate_user!  #Zugriff nur für angemeldete Benutzer zulassen

  def create
    @book = Book.find(params[:book_id])
    @comment = Comment.new(comment_params)  #Zu diesem Zeitpunkt wird eine Validierungsprüfung durchgeführt!
    @comment.book_id = @book.id
    @comment.user_id = current_user.id
    unless @comment.save  #@Wenn der Kommentar nicht gespeichert werden konnte
      render 'error'      #comments/error.js.Erb anrufen(Siehe unten)
    end
  end

  private
  def comment_params
    params.require(:comment).permit(:comment)
  end
end

Die durch die Parameter übergebenen Werte werden verwendet, um sich mit den Methoden new und save in der Datenbank zu registrieren. Zu diesem Zeitpunkt können die externen Schlüssel book_id und user_id nicht über Parameter abgerufen werden, daher werden sie zu diesem Zeitpunkt festgelegt. Nun, ist alles soweit in Ordnung?

Wichtig hierbei ist, dass die Validierungsprüfung unmittelbar vor dem Speichern in der Datenbank durchgeführt wird. Die Instanzvariable, die Sie in der Fehleranweisung erhalten, lautet also @comment = Comment.new(comment_params) Ist das. Mit anderen Worten, es wird geprüft, ob der Wert selbst, der den Parameter übergeben hat, einen Fehler enthält.

Als nächstes befindet sich der Kommentarbereich auf der Detailseite von Book. Überprüfen wir also den Controller von Books!

Bücher Controller

books_controller.rb


class BookController < ApplicationController
  before_action :authenticate_user!  #Zugriff nur für angemeldete Benutzer zulassen

  def show
    @book = Book.find(params[:id])
    @comment = Comment.new  #Kommentiert die neue Methode zum Übergeben von Werten an die Steuerung
  end
end

Auch hier wird es kein Problem geben! Sie haben den Wendepunkt erreicht. Lassen Sie uns die Detailseite von Book in diesem Tempo überprüfen!

Bücher zeigen Seite

ruby:app/views/books/show.html.erb


  <div id="comments_error">
    <%= render 'layouts/errors', model: @comment %>
  </div>

  <%= form_with model:[@book,@comment] do |f| %>
    <%= f.text_area :comment %>
    <%= f.submit 'Senden'%>
  <% end %>

Im Teil von comment_error in der ersten Hälfte wird _errors.html.erb von Layouts durch Rendern aufgerufen.

Außerdem habe ich ein Kommentareingabefeld mit form_with bereitgestellt, möchte aber die asynchrone Kommunikation festlegen, sodass ich local: true nicht beschreiben werde. Im Fall von "form_with" wird standardmäßig die asynchrone Kommunikation verwendet, sodass "remote: true" nicht geschrieben werden muss.

Teilweise Teil der Fehlermeldung

ruby:app/views/layouts/_errors.html.erb


<% if model.errors.any? %>
  <div id="error_explanation">
    <h3>
      <%= pluralize(obj.errors.count, "error") %> prohibited this model from being saved:
    </h3>

    <ul>
      <% model.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>

Erinnerst du dich daran, wie du mit Rendern von der Show-Seite der Bücher angerufen hast? Die Fehlermeldung ist endlich da. error.full_messages ruft alle Fehlermeldungen in einem Array ab. Da davon ausgegangen wird, dass wir in mehreren Fehlern gefangen sind, führen wir mit jeder Methode eine Schleife durch. Da diese Fehleranweisung standardmäßig enthalten ist, kann sie in anderen Situationen als im Kommentarbereich verwendet werden.

Js-Datei für die asynchrone Kommunikation von Fehlermeldungen

ruby:app/views/comments/error.js.erb


$("#comments_error").html("<%= j(render 'layouts/errors', model: @comment) %>");

In books / show.html.erb wird der Teil von id =" comment_error " neu geschrieben. Wenn Sie auf "id =" comment_error "" mit "$ (" # comment_error ")" abzielen, wird es mit dem Inhalt von "layouts / _errors.html.erb" neu geschrieben, der in "render'layouts / error" angegeben ist.

Außerdem wird hier "@ comment" an model übergeben, aber wissen Sie, wo dies definiert ist? Die js-Datei wurde vom Comments-Controller aufgerufen. Das heißt, in der Aktion "Erstellen" im Controller "Kommentare" definiert. @comment = Comment.new(comment_params) Wird an layouts / _errors.html.erb übergeben.

Hmmm, es ist kompliziert! !!

(Ergänzung) Die js-Datei der Kommentarfunktion selbst wird ebenfalls beschrieben.

ruby:app/views/comments/create.js.erb


$(".comments").html("<%= j(render 'comments/index', book: @book) %>");
$("#comment_comment").val("");

Bildschirmbild

Durch Implementierung einer asynchronen Kommunikation image.png Wenn Sie versuchen, einen Kommentar mit "leer" zu senden, image.png Ich war wütend wie ich erwartet hatte. Damit ist die Fehlermeldung bei asynchroner Kommunikation abgeschlossen! Es ist möglich, den Nachrichtentext in Japanisch zu konvertieren. Aus Platzgründen ist dies jedoch eine weitere Möglichkeit.

abschließend

Die asynchrone Kommunikation hat viele Controller und Übergänge von Seite zu Seite, daher ist sie sehr verwirrend. Wenn Sie es mehrmals zurücklesen, wird es Ihrem Verständnis näher kommen. Wenn Sie sich über den Prozessablauf ärgern, können Sie möglicherweise die Implementierungszeit verkürzen. Entschuldigung. Lass uns zusammen lernen und unser Bestes geben!

Recommended Posts

[Rails] Ich habe die Validierungsfehlermeldung mit asynchroner Kommunikation implementiert!
Buchungsfunktion implementiert durch asynchrone Kommunikation in Rails
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
[Rails] Lassen Sie uns die Fehlermeldung ins Japanische übersetzen
Schienen ~ Die Nachrichtenfunktion verstehen ~
[Java] Ich habe versucht, die Kombination zu implementieren.
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil2 -Benutzerauthentifizierung-
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil3-Aktionsimplementierung mit Authentifizierung
Ich sehe keinen Fehler bei der Installation des Rails-Bundles ... der Lösung
[Rails] Unerwarteter Validierungsfehler im Gerät
[Rails] Ich habe versucht, die Anwendung zu löschen
Ich habe versucht, den Punktzähler durch serielle Kommunikation mit der MZ-Plattform zu verbinden
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil1-Aktionsimplementierung ohne Authentifizierung-
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Asynchrone Kommunikation im interaktiven Kommentarfeld
Erhalten Sie eine Fehlermeldung mit einer beliebigen Methode
Implementieren Sie eine benutzerdefinierte Validierung mit Anmerkungen in Spring Framework und geben Sie eine Nachricht aus
[Ruby on Rails] So japanisieren Sie die Fehlermeldung des Formularobjekts (ActiveModel)