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.
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]
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]
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.
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 |
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.
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 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("☑") :
view_context.raw("☐")
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.
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("☑") : raw("☐")
end
Nous allons omettre le module HtmlBuilder et le présentateur de formulaire.
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]
Recommended Posts