Ruby on Rails6 Praktischer Leitfaden cp13 ~ cp15 [Memo]

Einführung

Der Autor dieses Artikels ist ein Anfänger, der gerade erst anfängt, Programmieren zu lernen. Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.

Überblick

Dieser Artikel ist eine persönliche Notiz von dem, was ich durch Lesen des Ruby on Rails 6 Practical Guide gelernt habe. Es scheint schwer zu lesen zu sein, da es auszugsweise und aufgegriffen ist. Entschuldigung. Dieses Buch hat auch eine Fortsetzung Erweiterung, und beide wurden zum Zeitpunkt des Schreibens des Artikels untersucht. Ich werde auch einen Artikel zur Überprüfung schreiben. Da es in 18 Kapitel unterteilt ist, werden wir es nach Überschriften unterteilen.

Vorheriger Artikel Ruby on Rails6 - Praktischer Leitfaden cp4 ~ cp6 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp10 ~ cp12 [Memo]

Kapitel 13 Zuordnung zwischen Modellen

Wechseln Sie die Verarbeitung abhängig davon, ob Ressourcen verschachtelt sind

routes.rb


resources :staff_members do
  resources :staff_evnets, only: [ :index ]
end
resources :staff_events, only: [ :index ]

Wenn das obige Routing konfiguriert ist

staff_events_controller.rb


def index
  if params[:staff_member_id]
    @staff_member = StaffMember.find(params[:staff_member_id])
    @events = @staff_member.events.order(occurred_at: :desc)
  else
    @events = StaffEvent.order(occurred_at: :desc)
  end
end

Sie können den Prozess abhängig davon ändern, ob der URL-Pfad staff_member_id enthält. Dieselbe Aktion kann sowohl für bestimmte Mitarbeiterereignisse als auch für alle Ereignisse verwendet werden.


render collection

= render partial: "event", collection: @events

Wenn Sie ein Array für die Erfassungsoption der Rendermethode in der Vorlage angeben und aufrufen, wird die Teilvorlage wiederholt so oft eingebettet, wie die Anzahl der Elemente im Array.

Ich habe im Detail recherchiert und einen Artikel geschrieben. Implementieren von Iterationen in View durch Rendern einer Sammlung [Rails]


N + 1 Problem

Es wird als N + 1-Problem </ strong> bezeichnet, dass die Anzahl der Abfragen ausgegeben wird, indem 1 zur Anzahl der Objekte hinzugefügt wird, die Sie erhalten möchten, obwohl Sie die Anzahl der Abfragen reduzieren können.

includes

@events = @events.includes(:member)

Wenn der Name der Zuordnung zur Includes-Methode angegeben wird, wird eine Abfrage ausgegeben, um die zugeordneten Modellobjekte in großen Mengen abzurufen. Infolgedessen werden weniger Abfragen ausgegeben, was häufig zu einer besseren Leistung führt.

Kapitel 14 Wertnormalisierung und -validierung

Wertnormalisierung

Methode zur Normalisierung

models/concern/string_normalizer.rb


require "nkf"

def normalize_as_text(text)
  NKF.nkf("-W -w -Z1", text).strip if text
end

def normalize_as_furigana(text)
  NKF.nkf("-W -w -Z1 --katakana", text).strip if text
end

Das NKF-Modul bietet japanischspezifische Konvertierungsfunktionen. Die Methode nkf verwendet die Flag-Zeichenfolge als erstes Argument und die zu konvertierende Zeichenfolge als zweites Argument und gibt die konvertierte Zeichenfolge zurück.

Flagge Bedeutung
-W Der eingegebene Zeichencode ist UTF-Geben Sie 8 an
-w UTF-Ausgabe bei 8
-Z1 Konvertieren Sie alphanumerische Zeichen, Symbole und Leerzeichen in voller Breite in halbe Breite
--katakana Wandle Hiragana in Katakana um

Liste der Flaggenzeichenfolgen

Flag-Strings können verkettet geschrieben werden.

NKF.nkf("-WwZ1", text)

Bei der Strip-Methode werden leere Zeichenfolgen am Anfang und Ende der Zeichenfolge entfernt.

before_vallidation

Der Prozess, der vor und nach der Validierung, dem Speichern, Löschen und anderen Vorgängen für das Modellobjekt ausgeführt wird, wird als Rückruf </ strong> oder Hook </ strong> bezeichnet. before_validation wird unmittelbar vor der Validierung ausgeführt.

before_validation do
  self.family_name = normalize_as_name(family_name)
  self.family_name_kana = normalize_as_furigana(family_name_kana)
end

Im obigen Beispiel werden der Name und die Frigana normalisiert, bevor die Validierung durchgeführt wird.


Gem data-validaor

Der Datenvalidator bietet eine Validierung des Datentyps.

Möglichkeit Was zu überprüfen
after Nach dem angegebenen Datum. Das angegebene Datum ist jedoch nicht enthalten.
before Vor dem angegebenen Datum. Das angegebene Datum ist jedoch nicht enthalten.
after_or_equal_to Nach dem angegebenen Datum. Es enthält jedoch das angegebene Datum.
before_or_equal_to Vor dem angegebenen Datum. Es enthält jedoch das angegebene Datum.
allow_blank Wenn Sie dies tun, sind Leerzeichen zulässig
before: -> (obj) { 1.year.from_now.to_date }

Für die Datumsüberprüfung können Sie ein Basisdatum dynamisch angeben, indem Sie ein Proc-Objekt angeben.

before: 1.year.from_now.to_date

Es funktioniert auch, wenn Sie es wie oben beschrieben schreiben, führt jedoch zu unerwarteten Ergebnissen, da der Wert des Vorher-Schlüssels basierend auf der Startzeit festgelegt wird.


validate

validate do
  unless Staff::Authenticator.new(object).authenticate(current_password)
    errors.add(:current_password, :wrong)
  end
end

validate wird verwendet, um die Validierung auf andere Weise als durch die integrierte Validierung zu implementieren.

Kapitel 15 Moderator

Was ist ein Moderator?

Die Klasse, die für die Generierung des einem Objekt zugeordneten HTML-Codes verantwortlich ist, wird als Präsentator </ strong> bezeichnet. Es ist kein offizieller Rails-Begriff, sondern ein Konzept, das in der Rails-Community geboren wurde.


Model Presenter

Präsentator, wenn das Ziel ein Modellobjekt ist.

app/presenters/model_presenter.rb


class ModelPresenter
  attr_reader :object, :view_context

  def initialize(object, view_context)
    @object = object
    @view_context = view_context
  end
end

Definieren Sie eine StaffMemberPresenter-Klasse, die von der ModelPresenter-Klasse erbt.

staff_member_presenter.rb


class StaffMemberPresenter < ModelPresenter

  #Mitarbeiter-Stopp-Flag auf/Gibt ein Symbol zurück, das off darstellt
  def suspended_mark
    object.suspended? ?
      view_context.raw("&#x2611;") :
      view_context.raw("&#x2610;")
  end
end

Verwendungsbeispiel </ strong>

ruby:staff_members/index.html.haml


- @staff_members.each do |m|
  - p = StaffMemberPresenter.new(m, self)
  - p.suspended

Ich erstelle eine Instanz von StaffMemberPresenter. Das StaffMember-Objekt wird im ersten Argument und self im zweiten Argument angegeben. Das Objekt, auf das in der Ansichtsvorlage von self verwiesen wird, wird als Ansichtskontext </ strong> bezeichnet. Dieses Objekt verfügt über alle in Rails definierten Hilfsmethoden als eigene Methoden.


Transfer

Durch die Delegierung können Sie Ihren Code präzise schreiben.

model_presenter.rb


  delegate :raw, to: :view_context

staff_member_presenter.rb


  delegate :suspended?, to: :object

Die Delegate-Methode definiert eine Instanzmethode mit dem im Argument angegebenen Namen und delegiert sie an das Objekt, das von der in der Option to angegebenen Methode zurückgegeben wird.

Kurz gesagt, Sie können den Empfänger beim Aufrufen der Methode weglassen. Durch die Definition des Delegaten ist es jetzt möglich, wie folgt präzise zu schreiben.

staff_member_presenter.rb


  def suspended_mark
    suspended? ? raw("&#x2611;") : raw("&#x2610;")
  end

Wir werden das HtmlBuilder-Modul und den Form Presenter weglassen.


Fortsetzung

Wir werden die URLs der folgenden Artikel einzeln hinzufügen.

Ruby on Rails6 - Praktischer Leitfaden cp16 ~ cp18 [Memo] Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp3 ~ cp6 [Memo] Ruby on Rails6 - Praktisches Handbuch [Funktionserweiterung] cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp10 ~ cp12 [Memo]

Quelle zitieren

Recommended Posts