[RUBY] Histoire de refactoring de rails apprise sur le terrain

Histoire apprise sur le terrain

C'est une architecture générale dont nous sommes conscients lors du développement de Rails.

Notez que vous faites attention à ne pas devenir un gros contrôleur ou un gros modèle. Puisqu'il s'agit d'une phrase aléatoire, je la corrigerai le cas échéant.

Le contrôleur est simple! !!

En fin de compte, je pense que la responsabilité de laisser le contrôleur suivre est la suivante.

** "Créer une instance, exécuter une méthode dessus et renvoyer une réponse" **

seulement ça.

C'est la pire chose à dire.

ruby:example.contoroller.rb



Il n'y a pas une telle action

def index
  @most_funded_projects = []
    most_funded_projects = Project.most_funded.includes(:main_image)
    most_funded_projects.each do |most_funded_project|
      break if @most_funded_projects.count >= 3
      if @site_project_descriptions[most_funded_project.id].present?
        @most_funded_projects << most_funded_project
      end
    end
    if @most_funded_projects.count < 4
      current_site.published_projects.order(updated_at: :desc).each do |project|
        break if @most_funded_projects.count >= 3
        @most_funded_projects << project
    end
  end 
end


La logique métier de Gorigori est écrite sur le contrôleur. J'écrivais un tel contrôleur et j'étais prudent. Si vous créez un contrôleur avec échafold, vous pouvez créer un contrôleur avec la forme simple suivante, mais en gros, il est idéal de le faire selon ce sentiment.

example.rb



def index
  @friends = Friend.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @friends }
  end
end

En bref, ce qui suit est la forme de base

@hoge = Hoge.new
@hoge.hoge
Renvoie une réponse

Si le contrôleur gonfle, passez d'abord au modèle! !!

Dans le contrôleur, il était important d'avoir une image de la création d'une instance associée au modèle et de l'exécution d'une méthode dessus. Donc, une fois que vous pensez à mettre toute votre logique métier dans le modèle. Cependant, comme il y a un autre problème pour tout assembler, l'image de mettre les choses dans le modèle est principalement ** des choses liées à la persistance et à la logique métier ** qui est complétée par l'exploitation d'un modèle unique. est.

Les modèles à implémenter dans le modèle sont généralement les suivants.

--Obtenir l'enregistrement de la table associée au modèle (opération ActiveRecord)

Je pense qu'un traitement simple comme la simple mise à jour d'une seule table est principalement applicable, et à part cela, une logique métier complétée par un seul modèle.

Utilisation de la classe de service

Les processus tels que les opérations de modèle multiples et les opérations sur les fichiers sont découpés en tant que couche de service en tant qu'unité de logique métier atomique.

Fondamentalement, créez une classe normale qui n'est pas liée à ActiveRecord (non liée à la table sur une base individuelle) sous la forme suivante. C'est comme créer une classe et séparer la logique complexe entre plusieurs modèles d'un modèle existant. C'est simple à utiliser, créez simplement une instance de la classe et exécutez les méthodes que vous avez créées pour elle.

exmple.rb


class ExampleService
  def initialize
    ....
  end

  def example
    ....
  end
end

Couper le consern et l'espace de noms et créer une classe sous le répertoire models

Même avec la méthode introduite, si le modèle ou la classe de service devient gros, coupez l'espace de noms sous le répertoire models, créez une classe simple qui n'est pas un à un avec la table et le modèle ou service qui y devient gras. Il existe également une technique pour empêcher le modèle et la classe de service de devenir gras en transférant ici la méthode qui semble être universellement utilisable dans la classe. Vous pouvez également utiliser consern pour combiner des éléments redondants en un seul. Par exemple, c'est une image qui crée des modèles / {nom de la table} / {cas d'utilisation} .rb et coupe le processus. Pour une meilleure visibilité, définissez les variables d'instance dans Controller.

Résumé de la division du contrôleur / du service / du modèle

Recommended Posts

Histoire de refactoring de rails apprise sur le terrain
À propos du symbole <%%> dans Rails erb
Communication asynchrone dans le champ de commentaire interactif
L'histoire de l'écriture de Java dans Emacs
[Rails] Réinitialisez la base de données dans l'environnement de production
Rails6: Extraire l'image dans le texte d'action
[Order method] Définit l'ordre des données dans Rails
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
Une histoire sur le JDK à l'ère de Java 11
J'ai essayé d'organiser la session en Rails
L'histoire de l'apprentissage de Java dans la première programmation
[Rails] Afficher les catégories à plusieurs niveaux dans la liste des rebuts
Group_by dans Rails
Refactoring dans JUnit
Comment vérifier les commandes Rails dans le terminal
[Rails] J'ai étudié la différence entre les ressources et les ressources
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
La fraction n'est-elle pas mauvaise en programmation? L'histoire.
L'histoire d'une exception d'état illégale dans Jetty.
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Questions sur l'implémentation de la fonctionnalité Like (Ajax) dans Rails
SSL dans l'environnement local de Docker / Rails / puma
[Rails] Comment afficher les images dans la vue
L'histoire que .java est également construite dans Unity 2018
Ruby on Rails 5 guide pratique d'apprentissage rapide qui peut être utilisé sur le terrain Résumé
Association de modèles dans Rails
Ajout de colonnes dans les rails
Désactiver les turbolinks dans les rails
^, $ dans l'expression régulière Rails
Utiliser des images avec des rails
Comprendre la migration dans les rails
Cliquez sur le bouton [rails] pour créer un mot de passe alphanumérique aléatoire et entrez-le dans le champ de mot de passe
Diviser routes.rb dans Rails6
Maîtrisez la portée [Rails]!
Markdown implémenté dans Rails
Lancer l'application Rails localement en mode production (édition du serveur API)
[Ruby on Rails] Afficher rapidement le titre de la page dans le navigateur
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
[Rails] Où faire attention dans la description de la validation
[Docker] Une histoire sur une erreur dans la composition de docker
Utilisez votre propre classe dans le répertoire lib avec Rails6
[Rails] Comment afficher les informations stockées dans la base de données dans la vue