Ruby on Rails6 Guide pratique cp13 ~ cp15 [Mémo]

introduction

L'auteur de cet article est un débutant qui commence à peine à apprendre la programmation. Je vous serais reconnaissant si vous pouviez signaler des erreurs.

Aperçu

Cet article est un mémo personnel de ce que j'ai appris en lisant le Guide pratique de Ruby on Rails 6. Il semble difficile à lire car il est extrait et repris. Excusez-moi. Ce livre a également une suite Extension, et les deux ont été étudiés au stade de la rédaction de l'article. J'écrirai également un article pour examen. Puisqu'il est divisé en 18 chapitres, nous le diviserons par titre.

Article précédent Guide pratique Ruby on Rails6 cp4 ~ cp6 [Memo] Guide pratique Ruby on Rails6 cp7 ~ cp9 [Memo] Guide pratique Ruby on Rails6 cp10 ~ cp12 [Memo]

Chapitre 13 Association entre modèles

Changer de traitement selon que les ressources sont imbriquées ou non

routes.rb


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

Lorsque le routage ci-dessus est configuré

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

Vous pouvez changer le processus selon que le chemin de l'URL inclut staff_member_id. La même action peut être utilisée pour les événements spécifiques des employés et tous les événements.


render collection

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

Si vous spécifiez un tableau pour l'option de collection de la méthode de rendu dans le modèle et que vous l'appelez, le modèle partiel sera incorporé à plusieurs reprises autant que le nombre d'éléments dans le tableau.

J'ai enquêté en détail et écrit un article. Implémentation d'itérations dans View en rendant une collection [Rails]


Problème N + 1

On appelle problème N + 1 </ strong> que le nombre de requêtes est émis en ajoutant 1 au nombre d'objets que vous souhaitez obtenir, même si vous pouvez réduire le nombre de requêtes.

includes

@events = @events.includes(:member)

Étant donné le nom de l'association à la méthode includes, une requête sera émise pour obtenir les objets de modèle associés en masse. Le résultat est moins de requêtes émises, ce qui conduit souvent à de meilleures performances.

Chapitre 14 Normalisation et validation des valeurs

Normalisation de la valeur

Méthode de normalisation

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

Le module NKF fournit des fonctions de conversion spécifiques au japonais. La méthode nkf prend la chaîne de caractères de l'indicateur comme premier argument et la chaîne de caractères à convertir comme deuxième argument, et renvoie la chaîne de caractères convertie.

drapeau sens
-W Le code de caractère d'entrée est UTF-Spécifiez pour être 8
-w UTF-Sortie à 8
-Z1 Convertir les caractères alphanumériques pleine largeur, les symboles et les espaces pleine largeur en demi-largeur
--katakana Convertir les hiragana en katakana

Liste de chaînes de drapeau

Les chaînes d'indicateur peuvent être écrites concaténées.

NKF.nkf("-WwZ1", text)

La méthode strip supprime les chaînes vides au début et à la fin de la chaîne.

before_vallidation

Le processus qui a lieu avant et après la validation, l'enregistrement, la suppression et d'autres opérations sur un objet de modèle s'appelle un rappel </ strong> ou un hook </ strong>. before_validation est exécuté juste avant la validation.

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

Dans l'exemple ci-dessus, le nom et frigana sont normalisés avant que la validation ne soit effectuée.


Gem data-validaor

Le validateur de données assure la validation du type de données.

option Que vérifier
after Après la date spécifiée. Cependant, la date spécifiée n'est pas incluse.
before Avant la date spécifiée. Cependant, la date spécifiée n'est pas incluse.
after_or_equal_to Après la date spécifiée. Cependant, il inclut la date spécifiée.
before_or_equal_to Avant la date spécifiée. Cependant, il inclut la date spécifiée.
allow_blank Si vous faites vrai, les espaces sont autorisés
before: -> (obj) { 1.year.from_now.to_date }

Pour la validation du type de date, vous pouvez spécifier une date de base de manière dynamique en spécifiant un objet Proc.

before: 1.year.from_now.to_date

Cela fonctionne même si vous l'écrivez comme ci-dessus, mais cela provoque des résultats inattendus car la valeur de la clé avant est fixée en fonction de l'heure de démarrage.


validate

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

validate est utilisé pour implémenter la validation autrement que par la validation intégrée.

Présentateur du chapitre 15

Qu'est-ce qu'un présentateur?

La classe chargée de générer le code HTML associé à un objet est appelée le présentateur </ strong>. Ce n'est pas un terme officiel de Rails, mais un concept né au sein de la communauté Rails.


Présentateur de modèle

Présentateur lorsque la cible est un objet modèle.

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

Définissez une classe StaffMemberPresenter qui hérite de la classe ModelPresenter.

staff_member_presenter.rb


class StaffMemberPresenter < ModelPresenter

  #Indicateur d'arrêt de l'employé activé/Renvoie un symbole représentant off
  def suspended_mark
    object.suspended? ?
      view_context.raw("&#x2611;") :
      view_context.raw("&#x2610;")
  end
end

Exemple d'utilisation </ strong>

ruby:staff_members/index.html.haml


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

Je crée une instance de StaffMemberPresenter. L'objet StaffMember est spécifié dans le premier argument et self est spécifié dans le second argument. L'objet référencé par self dans le modèle de vue est appelé le contexte de vue </ strong>. Cet objet a toutes les méthodes d'assistance définies dans Rails comme ses propres méthodes.


transfert

La délégation vous permet d'écrire votre code de manière concise.

model_presenter.rb


  delegate :raw, to: :view_context

staff_member_presenter.rb


  delegate :suspended?, to: :object

La méthode déléguée définit une méthode d'instance avec le nom spécifié dans l'argument et la délègue à l'objet renvoyé par la méthode spécifiée dans l'option to.

En bref, vous pouvez omettre le récepteur lors de l'appel de la méthode. À la suite de la définition du délégué, il est maintenant possible d'écrire de manière concise comme ci-dessous.

staff_member_presenter.rb


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

Nous allons omettre le module HtmlBuilder et le présentateur de formulaire.


A continué

Nous ajouterons les URL des articles suivants un par un.

Guide pratique Ruby on Rails6 cp16 ~ cp18 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp3 ~ cp6 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp7 ~ cp9 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp10 ~ cp12 [Memo]

Source du devis

Recommended Posts