Ceci est le premier message. J'ai appris Ruby on Rails à l'école et j'ai eu un programme de refactorisation, mais à ce moment-là, j'étais désespéré de le terminer, et je ne l'avais pas refactoré, donc cette fois j'ai déplacé la logique du contrôleur vers Model et rendu le contrôleur plus propre. J'écrirai la méthode.
Il se réfère à l'état du contrôleur où le nombre de lignes du contrôleur lui-même est grand et il est difficile de suivre le flux de traitement (simplement parlant, les perspectives sont mauvaises). À l'école, j'ai écrit toute la logique de Controller sans m'en rendre compte du tout, mais je me bats toujours avec Fat Controller, une application personnelle, car je veux me rapprocher du code de niveau pratique (rires).
Tout d'abord, nous allons avoir envie de déplacer toute la logique du contrôleur extrêmement gonflée vers Model. Les actions sont suffisantes pour les méthodes publiques décrites dans Controller.
Et je pense qu'il n'y a fondamentalement aucun problème avec Model comme destination pour déplacer la logique.
Avant de sculpter ↓
ruby:users.controller.rb
def show
@useritems = Item.includes(:images).where(user_id:(current_user.id)).order(id: "DESC") if user_signed_in?
end
Puisque la fonction d'authentification est implémentée à l'aide de devise, l'identifiant de l'utilisateur actuellement connecté peut être obtenu avec "current_user.id". En d'autres termes, je souhaite extraire les informations de l'élément de l'utilisateur dans Ma page (action Afficher) de l'utilisateur actuellement connecté. Cependant, cette acquisition de données, en fait, est également utilisée dans l'action d'index de "items.controller.rb". Je voudrais donc définir une méthode dans Model et résumer la description pour obtenir l'élément de l'utilisateur.
Tout d'abord, contrôleur
ruby:users.controller.rb
def show
@useritems = Item.user_items_get(current_user.id) if user_signed_in?
end
Étant donné que "utilisateur_actuel" ne peut pas être utilisé du côté modèle, passez-le en argument.
Puis modèle
Item.rb
def self.user_items_get(user_bigint)
Item.includes(:images).where(user_id:(user_bigint)).order(id: "DESC")
end
En faisant cela, même l'action d'index de ItemController
ruby:items.cotroller.rb
def index
@useritems = Item.user_items_get(current_user.id).limit(10) if user_signed_in?
end
Il peut être utilisé comme ça.
Quand il s'agit d'écrire une méthode dans Model et de l'appeler avec Controller, les débutants ont tendance à penser que c'est un gros problème, mais il est important de rendre Controller propre, alors veuillez l'utiliser. (Le nombre de lignes dans cet exemple n'a pas diminué ... lol)
Recommended Posts