[RUBY] Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist

Ich habe von einem Elite-Ingenieur am Arbeitsplatz gelernt, dass das Lesen eines guten Codes ein Katalysator für das Wachstum als Ingenieur ist, also habe ich ihn sofort in die Praxis umgesetzt! Ich werde es übrigens teilen.

Wenn Sie guten Code lernen, können Sie Code schreiben, der gut lesbar ist und nur wenige Fehler aufweist. Lesen Sie ihn daher ebenfalls.

Beginnen Sie mit link_to.

Definition von link_to

def link_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options, name = options, name, block if block_given?
  options ||= {}

  html_options = convert_options_to_data_attributes(options, html_options)

  url = url_for(options)
  html_options["href"] ||= url

  content_tag("a", name || url, html_options, &block)
end

Ändern Sie unter Ruby on Rails Official API den Namen (wenn block = do ~ end nicht verwendet wird). Die anzuzeigende Zeichenfolge, URL-Informationen in Optionen und der Wert, den Sie im HTML-Tag für ein Tag wie class und rel festlegen möchten, werden in html_options übergeben.

Es wird davon ausgegangen, dass Optionen und HTML-Optionen im Hash-Format übergeben werden.

Sofort werde ich Zeile für Zeile Interpretation hinzufügen.

def link_to(name = nil, options = nil, html_options = nil, &block)

Die Beschreibung von = nil in der Argumentdefinition bedeutet, dass, wenn kein Wert zugewiesen wird, nil dem relevanten Argument zugewiesen wird. & Block im 4. Argument ist eine Beschreibung für den Empfang eines "Blocks". Wenn Sie diesen Artikel lesen, wird beim Übergeben eines Codeabschnitts ein Block verwendet, kein Wert als Argument ***. *** Es scheint, dass der übergebene Codeabschnitt als Block *** bezeichnet wird.

Beim Schreiben von link_to do ~ end wird ~ hier ersetzt.

Nächste Zeile

html_options, options, name = options, name, block if block_given?

block_given? (Ruby-Referenzhandbuch) Aus dem Referenzhandbuch, block_given? Ist true und der Inhalt der if-Anweisung wird ausgeführt, wenn der Block an die link_to-Methode übergeben wird. Mit anderen Worten, es handelt sich um Multiple Assignment (Ruby Reference).

Beispiel bei Verwendung von Block aus der offiziellen Ruby on Rails-API (https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to)

link_to(options = {}, html_options = {}) do
  # name
end

Wird beschrieben als In diesem Fall werden Optionen (URL-Informationen) an den Namen übergeben, der ursprünglich der Anzeigename ist, und html_options, das Klasse und ID definiert, wird ab der ersten Zeile der link_to-Definition an Optionen übergeben, bei denen es sich um URL-Informationen handelt.

Daher besteht die Aufgabe dieser Zeile darin, die von der Methode definierte Neuzuweisung so vorzunehmen, dass sie wie vom Benutzer des Verfahrens beabsichtigt funktioniert. (Beispielsweise wird der Wert des Namens, dem URL-Informationen zugewiesen wurden, den Optionen neu zugewiesen.)

Nächster

options ||= {}

||=Ist eine Beschreibung, dass der Wert der rechten Seite zugewiesen wird, wenn die linke Seite falsch oder nicht definiert ist. Wenn in der ersten Zeile kein Wert an das Argument übergeben wird, wird den Optionen nil zugewiesen, sodass der Inhalt der Optionen nil, dh false, ist. Zu diesem Zeitpunkt wird den Optins {} (leerer Hash) zugewiesen.

html_options = convert_options_to_data_attributes(options, html_options)

Eine Methode namens convert_options_to_data_attributes wird aufgerufen.

Lesen der Methode convert_options_to_data_attributes

Die Definition dieser Methode lautet Link hier.

def convert_options_to_data_attributes(options, html_options)
  if html_options
    html_options = html_options.stringify_keys
    html_options["data-remote"] = "true".freeze if link_to_remote_options?(options) || link_to_remote_options?(html_options)

    method = html_options.delete("method".freeze)

    add_method_to_attributes!(html_options, method) if method

    html_options
  else
    link_to_remote_options?(options) ? { "data-remote" => "true".freeze } : {}
  end
end

Lesen wir convert_options_to_data_attributes.

Die dritte Zeile wird ausgeführt, wenn html_options vorhanden ist.

html_options = html_options.stringify_keys

stringfy_keys ist eine Rails-Methode, die einen Hash vom symbolischen in das String-Format konvertiert.

4. Zeile

html_options["data-remote"] = "true".freeze if link_to_remote_options?(options) || link_to_remote_options?(html_options)

Kurz gesagt, wenn options oder html_options die Einstellung remote: true hat, wird true dem Schlüsseldaten-remote im Zeichenfolgenformat zugewiesen.

Sie können verstehen, warum dies passiert, wenn Sie den Inhalt von link_to_remote_options? Of the Rails-Methode verstehen. Bitte beziehen Sie sich zuerst darauf, da dies in der Interpretation der else-Anweisung ausführlich beschrieben wird.

5. Zeile

method = html_options.delete("method".freeze)

Löschen für den Hash löscht den Schlüssel, der dem Argumentwert entspricht → gibt den gelöschten Schlüsselwert zurück Masu Das Argument ist die Methode ".freeze. freeze löscht nicht die erste Funktion von delete, sondern die zweite Funktion. Das heißt, gibt nur den Wert der Methode zurück.

Daher wird der Variablenmethode der Wert der Schlüsselmethode von html_options zugewiesen. (Wert für die Einstellung der HTML-Methode) Diese Art zu schreiben ist interessant.

6. Zeile

add_method_to_attributes!(html_options, method) if method

Wenn der Wert der Methode festgelegt ist, rufen Sie außerdem [add_method_to_attributes! Method] auf (https://apidock.com/rails/ActionView/Helpers/UrlHelper/add_method_to_attributes%21). Da es ein! Mark hat, ist es eine destruktive Methode.

add_method_to_attributes! -Methode

Die Methode add_method_to_attributes! Ist wie folgt definiert.

def add_method_to_attributes!(html_options, method)
  if method_not_get_method?(method) && html_options["rel"] !~ /nofollow/
    if html_options["rel"].blank?
      html_options["rel"] = "nofollow"
    else
      html_options["rel"] = "#{html_options["rel"]} nofollow"
    end
  end
  html_options["data-method"] = method
end

Add_method_to_attributes! Methodenlesung

add_method_to_attributes! Methode 2. Zeile.

Der bedingte Ausdruck von if ist eine UND-Bedingung. Ein Element der UND-Bedingung ist die Rückgabe von method_not_get_method? Method. Wert.

Der Definitionsausdruck dieser Methode wird weggelassen, aber wie der Name schon sagt, wird true für andere Methoden als get (z. B. delete) zurückgegeben. (Es ist die Benennungsmethode, die auch im lesbaren Code enthalten ist!)

Das zweite Element der UND-Bedingung ist das dritte Element im Abschnitt! Der Ruby-Referenz. True, wenn der Wert des Schlüssels rel in html_options nicht folgt.

add_method_to_attributes! Methodenzeilen 3-7

Wird ausgeführt, wenn die oben genannte UND-Bedingung erfüllt ist.

if html_options["rel"].blank?
  html_options["rel"] = "nofollow"
else
  html_options["rel"] = "#{html_options["rel"]} nofollow"
end

Lass uns sofort gehen. Wenn der Wert des Schlüssels rel von html_options leer ist, wird die Zeichenfolge nofollow zugewiesen. Wenn der Wert des Schlüssels rel von html_options einen Wert enthält, fügen Sie zusätzlich zum festgelegten Wert die Zeichenfolge nofollow hinzu.

In Kombination mit der if-Anweisung in der zweiten Zeile wird rel = "nofollow" für andere Methoden als get festgelegt, unabhängig davon, ob der Wert in rel festgelegt ist.

Die Bedeutung von nofollow ist übrigens ["Links vom Crawlen ausschließen"](https://www.seohacks.net/blog/column/1140/#:~:text=rel%3D%E2%80%9Dnofollow%E2 % 80% 9D% E3% 81% AE% E6% 84% 8F% E5% 91% B3,% E3% 81% AA% E3% 81% 8F% E3% 81% AA% E3% 82% 8B% E3% 81% A8% E3% 81% 84% E3% 81% 86% E3% 81% 93% E3% 81% A8% E3% 81% A7% E3% 81% 99% E3% 81% AD% E3% 80% 82) Das stimmt.

Ich bin mir nicht sicher, warum es besser ist, anderen Methoden als get nofollow hinzuzufügen, und ich kann nur raten, also werde ich es weglassen. Weitere Informationen zur Verwendung von rel selbst finden Sie unter [hier](https://saruwakakun.com/html-css/basic/link-rel#:~:text=%E2%86%91%20rel%E3%81%AF%E3 % 80% 8Crelation% EF% BC% 88% E9% 96% A2% E4% BF% 82,% E3% 81% A7% E7% A4% BA% E3% 81% 99% E3% 82% 8F% E3% 81% 91% E3% 81% A7% E3% 81% 99% E3% 81% AD% E3% 80% 82)

add_method_to_attributes! Methode 8. Zeile.

html_options["data-method"] = method

Wenn umgekehrt die get-Methode angegeben wird, verzweigt die if-Anweisung in der zweiten Zeile in die else-Anweisung. Der obige Code wird ausgeführt.

Der HTTP-Methodentyp ist dem Schlüssel "Datenmethode" von html_options zugeordnet. Da es sich um "Daten-" handelt, wird es als benutzerdefiniertes Attribut definiert.

Schließlich ist die Interpretation der Methode add_method_to_attributes! Abgeschlossen.

Kehren Sie zum Lesen von convert_options_to_data_attributes zurück

(Erneut veröffentlichen)

def convert_options_to_data_attributes(options, html_options)
  if html_options
    html_options = html_options.stringify_keys
    html_options["data-remote"] = "true".freeze if link_to_remote_options?(options) || link_to_remote_options?(html_options)

    method = html_options.delete("method".freeze)

    add_method_to_attributes!(html_options, method) if method

    html_options
  else
    link_to_remote_options?(options) ? { "data-remote" => "true".freeze } : {}
  end
end

7. Zeile.

Gibt den Hash html_options mit den beiden in den Zeilen 4 und 6 zugewiesenen Werten zurück.

Zeilen 8-9

Wenn kein Wert an html_options übergeben wird

link_to_remote_options?(options) ? { "data-remote" => "true".freeze } : {}

Wird ausgeführt.

Es ist ein ternärer Operator. Zunächst wird link_to_remote_options? aufgerufen.

def link_to_remote_options?(options)
  if options.is_a?(Hash)
    options.delete("remote".freeze) || options.delete(:remote)
  end
end

link_to_remote_options? -Methode

Wenn der Wert von options ein Hash ist, wird der Inhalt der if-Anweisung ausgeführt

Selbst wenn remote festgelegt ist und remote: false definiert ist, ist der Wert eines Elements false. Dort werden zwei Elemente aufgerufen, und diesmal wird die Remote-Einstellung gelöscht, da keine Beschreibung des Einfrierens vorliegt.

Kurz gesagt, link_to_remote_options? Gibt false zurück, wenn OR false nicht angegeben ist, und true, wenn der Wert von remote true ist.

Lesen Sie erneut die else-Anweisung der Methode convert_options_to_data_attributes

Wenn true in einem Element vom ternären Operator zurückgegeben wird, dh remote: true festgelegt ist, ist das Symbol "data-remote" => true der Rückgabewert von convert_options_to_data_attributes.

Der Grund, warum der Wert der Schlüsseldatenfernbedienung von html_options in einer der if-Anweisungen in convert_options_to_data_attributes festgelegt wird, besteht darin, dass das benutzerdefinierte Attribut festgelegt wird, unabhängig davon, ob der Remoteeinstellungswert an das Argument link_to method, options oder html_options übergeben wird. Es scheint, dass der Wert von remote in HTML angezeigt wird.

Das Muster zum Schreiben der Übergabe des Werts an link_to wird hier weggelassen.

Kehren Sie zu link_to zurück

(Erneut veröffentlichen)

def link_to(name = nil, options = nil, html_options = nil, &block)
  html_options, options, name = options, name, block if block_given?
  options ||= {}

  html_options = convert_options_to_data_attributes(options, html_options)

  url = url_for(options)
  html_options["href"] ||= url

  content_tag("a", name || url, html_options, &block)
end

Bis zur 4. Zeile wurde der Wert von html_options formatiert.

Als nächstes kommt die 5. Zeile.

url = url_for(options)

Die url_for-Methode wird aufgerufen.

def url_for(options)
    if options[:only_path]
      path_for options
    else
      full_url_for options
    end
end

path_for ist eine Methode, die einen relativen Pfad ausgibt, und full_url_for ist eine Methode, die einen absoluten Pfad ausgibt. Gibt den relativen Pfad aus, wenn der Wert des Optionsschlüssels only_path wahr ist.

6. Zeile von link_to

html_options["href"] ||= url

Ersetzen Sie den generierten Pfad durch den Schlüssel href von html_options. Daraus können Sie ersehen, dass Sie die URL zwangsweise angeben können, indem Sie href als Schlüssel für den dritten Faktor von link_to verwenden.

Ob es verwendet wird oder nicht ...

Letzte 7. Zeile

content_tag("a", name || url, html_options, &block)

[content_tag ist ein Ansichtshelfer]. (https://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag) Gibt das HTML-Tag aus.

Das erste Argument ist der Typ des HTML-Tags, in diesem Fall .

Das zweite Argument ist die anzuzeigende Zeichenfolge. In diesem Fall wird die URL automatisch als Zeichenfolge angezeigt, wenn der Name nicht vorhanden ist.

Wenn Sie die Klasse "XXX" usw. im Hash-Format an html_options übergeben, wird sie als Text angezeigt.

Wie Sie der Beschreibung und dem Block entnehmen können, wird der Block, wenn er an link_to übergeben wird (wenn er im Format link_to ~ do ~ end geschrieben ist), unverändert an content_tag übergeben.

Dies ist das Ende des Lesens von link_to.

Rauer Fluss

① Ordnen Sie die Reihenfolge der zugewiesenen Argumente ② Formatieren Sie Werte wie URL und Methode ③ Anzeige mit content_tag

das ist alles.

Impressionen habe ich diesmal ausprobiert

** Erster Punkt ** Wenn Sie zunächst die Definition der Methode kennen, können Sie anscheinend wie erwartet ausgeben. Wenn Sie beispielsweise einen Ansichtshelfer verwenden, können Sie den Aufwand für das Schreiben von Code durch Ausprobieren reduzieren. Erstellen und Ausgeben der gewünschten Anzeige.

** Zweiter Punkt ** ||=Oder&Ich hatte gesehen, wie man einen Block schreibt, aber ich habe es geschafft, den Code ohne ihn zu schreiben, also habe ich die Bedeutung nicht verstanden und es war eine gute Gelegenheit.

Zum Beispiel||=In diesem Fall bedeutet die Variable, wenn sie undefiniert oder null ist, Zuweisung. Wenn Sie sie jedoch schreiben, ohne es zu wissen, können Sie einfach in einer Zeile ausdrücken, in der Sie mit der if-Anweisung kompliziert schreiben würden.

Wie eingangs erwähnt, können Sie durch das Erlernen des Schreibens von gutem und intelligentem Code Code schreiben, der einfach zu warten und weniger fehleranfällig ist.


Ich werde auch in Zukunft weiter lernen!

Recommended Posts

Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Verwendung der link_to-Methode
[Schienen] Verwendung der Kartenmethode
[Rails] So lassen Sie die Anzeige der Zeichenfolge der link_to-Methode weg
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Verwendung der include? -Methode
[Rails] Ich habe versucht, die Anwendung zu löschen
Daten sortieren Absteigend, aufsteigend / Schienen
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, die verwendeten Methoden zusammenzufassen
[Java] Verwendung der toString () -Methode
Wie man Parameter in der link_to-Methode hat
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Stream-API zusammenzufassen
Was ist Docker? Ich habe versucht zusammenzufassen
Speicherort der Methodendefinition Zusammenfassung der zu überprüfenden Informationen Wenn im Projekt und in Rails / Gem definiert
[Rails] Verwendung der Hilfsmethode, Confimartion
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
[Rails] So lösen Sie die Zeitverzögerung von created_at nach der Speichermethode
Ausgabe der Verwendung der Slice-Methode
Code zum Verbinden von Rails 3 mit PostgreSQL 10
Verwendung der replace () -Methode (Java Silver)
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
So überprüfen Sie Rails-Befehle im Terminal
[Ruby-Grundlagen] Verwendung der Slice-Methode
[Rails / ActiveRecord] Ich möchte den Wert überprüfen, bevor der Typ konvertiert wird (_before_type_cast).
[JavaScript] Der stärkste Fall, als ich versuchte, die Teile zusammenzufassen, die ich nicht verstehe
[Rails] So bedienen Sie die in der Hauptanwendung verwendete Hilfsmethode mit Administrate
[JDBC ③] Ich habe versucht, mithilfe von Platzhaltern und Argumenten Eingaben über die Hauptmethode vorzunehmen.
[Rails] So stellen Sie über den HTTP-Client eine Verbindung zu einer externen API her (ich habe versucht, eine Verbindung zur Qiita-API herzustellen)
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
[Rails] So verwenden Sie die Hilfsmethode von devise before_action: authenticate_user!
[Ruby on Rails] So ändern Sie den Spaltennamen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
[Rails] So ändern Sie den Spaltennamen der Tabelle
So deinstallieren Sie Rails
Ich habe versucht, verschiedene link_to zusammenzufassen, die dieses Mal verwendet wurden
Rails6 Ich habe versucht, Docker in eine vorhandene Anwendung einzuführen
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Ich möchte die Hauptmethode mit Reflektion aufrufen
[Rails] So erhalten Sie den Inhalt starker Parameter
[Grober Kommentar] Ich möchte die Zupfmethode heiraten