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.
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!
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!
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!
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!
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.
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.
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! !!
ruby:app/views/comments/create.js.erb
$(".comments").html("<%= j(render 'comments/index', book: @book) %>");
$("#comment_comment").val("");
Durch Implementierung einer asynchronen Kommunikation Wenn Sie versuchen, einen Kommentar mit "leer" zu senden, 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.
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