Ruby on Rails Résumé des exemples de méthodes de refactoring autour de MVC

La quantité de code qui augmente et la lisibilité qui diminue lorsque vous l'écrivez comme vous le souhaitez sans y penser ... Pour les débutants, nous avons résumé les méthodes qui peuvent être utilisées pour chaque MVC afin qu'elles puissent être résumées le plus concis possible.

Revoir le rôle de MVC

MVC rôle
Model Manipulation des données manipulées par l'application/En traitement
View Affichage des informations à l'utilisateur, réception des entrées de l'utilisateur
Controller Échangez des informations avec Model et View

Comprenez ce rôle et décrivez le traitement approprié pour chaque rôle. Si vous écrivez dans chaque fichier comme vous le souhaitez sans tenir compte du rôle, la maintenance deviendra difficile. Par exemple, si le processus à décrire dans Model est décrit dans Controller, Fat Controller Des problèmes tels que (Contrôleur avec beaucoup de code écrit et gonflé) sont susceptibles de se produire.

Comment réduire la quantité de code dans Controller

Décrivez dans le modèle.

Compte tenu de chaque rôle de MVC mentionné ci-dessus, la méthode responsable du traitement / traitement des données est décrite dans Modèle.

Avant correction

app/controllers/posts_controller.rb


class PostsController < ApplicationController
  def index
    @posts = Post.order(created_at: :desc).limit(10)
  end
end

Après correction (passer au modèle)

Défini comme une méthode de classe afin qu'elle puisse être appelée directement dans la classe Model.

app/models/post.rb


class Post < ApplicationRecord
  def self.latest(number)
    order(created_at: :desc).limit(number)
  end
end

Appeler une méthode sur le contrôleur

app/controllers/posts_controller.rb


class PostsController < ApplicationController
  def index
    @posts = Post.latest(10)
  end
end

Vous pouvez également utiliser la portée au lieu des méthodes de classe.

app/models/post.rb


class Post < ApplicationRecord
  scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
end

app/controllers/posts_controller.rb


class PostsController < ApplicationController
  def index
    @posts = Post.latest
  end
end

Comment réduire la quantité de code dans Model

Utiliser Concern

Lorsque le même processus est décrit à plusieurs reprises dans plusieurs modèles, Concern peut être utilisé pour supprimer le processus commun.

app/models/post.rb


scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
def hoge
  puts "hogehoge"
end

app/models/comment.rb


scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
def hoge
  puts "hogehoge"
end

Créez un fichier dans app / models / concerts et décrivez le traitement courant.

app/models/concerns/common_module.rb


module CommonModule
  extend ActiveSupport::Concern
  included do
    scope :latest, -> (number = 10){order(created_at: :desc).limit(number)}
    def self.hoge
      puts "hogehoge"
    end
  end
end

Un traitement commun peut être utilisé en incluant dans chaque modèle.

app/models/post.rb


include CommonModule

app/models/comment.rb


include CommonModule

Découper la validation

La description de la validation, qui a tendance à être longue, peut être découpée au validateur. Créez un répertoire de validateurs sous le répertoire de l'application et créez un fichier pour la validation.

app/validators/post_validator.rb


class PostValidator < ActiveModel::Validator
  def validate(record)
    prohibited_words = ["baka","aho"]
    if prohibited_words.any?{ |word| record.content.include?(word) }
      record.errors.add(:content, "Contient des mots interdits.")
    end
  end
end

Décrivez en plus du côté du modèle.

app/models/post.rb


validates_with PostValidator

Coupez le rappel

Les rappels peuvent également être supprimés du modèle. Créez un répertoire app / callbacks et créez un fichier pour les rappels. (Le nom de la classe doit être le même que le nom du rappel)

app/callbacks/post_callback.rb


class PostCallback
  def before_create(post)
    post.title = "No Title" if post.title.blank?
  end
end

Décrivez en plus du côté du modèle.

app/models/post.rb


before_create PostCallback.new

Recommended Posts

Ruby on Rails Résumé des exemples de méthodes de refactoring autour de MVC
Résumé de la validation Ruby on Rails
Résumé des méthodes de mise à jour de plusieurs colonnes [Ruby on Rails]
Variables Ruby on Rails, résumé constant
[Ruby on Rails] Méthode d'aide pratique
[Ruby on Rails] Aucune erreur de méthode méthode non définie `devise_for'error resolution
Ruby on Rails ~ Principes de base de MVC et du routeur ~
Ruby on Rails Comment implémenter la saisie d'adresse automatique
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Association Ruby On Rails
[Ruby] Résumé des définitions de méthode
[Ruby on Rails] Fonction de recherche (modèle, formule de sélection de méthode)
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
Record d'apprentissage de Ruby on rails -2020.10.09
Record d'apprentissage Ruby on rails-2020.10.07 ②
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
[Ruby] Notes sur la méthode gets
Record d'apprentissage de Ruby on rails -2020.10.06
Mémorandum de base Ruby on Rails
[Ruby on Rails] méthode indéfinie ʻid'for nil: méthode de résolution d'erreur NilClass
Recherche d'enregistrements Ruby on Rails, création sinon méthode find_or_create_by
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
[Ruby on Rails] Introduction de la fonction de pagination
Connaissance de base de Ruby on Rails
Comment utiliser Ruby on Rails
Ruby on Rails compatible japonais-anglais i18n
(Ruby on Rails6) "Effacer" le contenu publié
[Ruby on Rails] Fonction de sortie CSV
Mémo de construction de l'environnement Ruby on Rails 6.0
[Ruby on Rails] Création de la page de confirmation
Ruby On Rails conçoit un conflit de routage
[Ruby on Rails] Implémentation de la fonction de commentaire
[Ruby on Rails] DM, fonction de chat
[Ruby on Rails] Arrêtez de "boucler jusqu'à ce que ..."
[Ruby on Rails] Aucune erreur de méthode: méthode non définie `t'for # <ActiveRecord :: Migration: 〇〇〇〇> Traitement des erreurs
[Ruby on Rails] Suivez la méthode indéfinie de la fonction ʻid'for nil: Résolvez l'erreur NilClass
[Ruby on Rails] Introduction des données initiales
[Ruby on Rails] Création d'un formulaire de demande
Ruby on Rails6 Guide pratique cp13 ~ cp15 [Mémo]
[Ruby on Rails] Afficher le test avec RSpec
[Ruby on Rails] Vérification du code à l'aide de Rubocop-airbnb
[Ruby on Rails] 1 modèle CRUD (routage principal)