Dies ist der erste Beitrag. Ich habe Ruby on Rails in der Schule gelernt und hatte einen Refactoring-Lehrplan, aber zu diesem Zeitpunkt wollte ich ihn unbedingt abschließen, und ich hatte ihn nicht refactored. Deshalb habe ich diesmal die Controller-Logik auf Model verschoben und den Controller sauberer gemacht. Ich werde die Methode schreiben.
Es bezieht sich auf den Zustand der Steuerung, in dem die Anzahl der Zeilen der Steuerung selbst groß ist und es schwierig ist, dem Verarbeitungsablauf zu folgen (einfach gesagt, die Sichtbarkeit ist schlecht). In der Schule habe ich die gesamte Logik in den Controller geschrieben, ohne es überhaupt zu merken, aber ich kämpfe immer noch mit der persönlichen Anwendung Fat Controller, weil ich dem Code auf praktischer Ebene näher kommen möchte (lacht)
Lassen Sie uns zunächst die enorm geschwollene Controller-Logik auf Model übertragen. Für öffentliche Methoden, die in Controller beschrieben sind, sind Aktionen ausreichend.
Und ich denke, dass es im Grunde kein Problem mit Model als Ziel gibt, um die Logik zu verschieben.
Vor dem Schnitzen ↓
ruby:users.controller.rb
def show
@useritems = Item.includes(:images).where(user_id:(current_user.id)).order(id: "DESC") if user_signed_in?
end
Da die Authentifizierungsfunktion mit devise implementiert wird, kann die ID des aktuell angemeldeten Benutzers mit "current_user.id" abgerufen werden. Mit anderen Worten, ich möchte die Informationen des Benutzers auf die Seite "Meine Seite" (Aktion anzeigen) des aktuell angemeldeten Benutzers ziehen. Diese Datenerfassung wird jedoch tatsächlich auch in der Indexaktion von "items.controller.rb" verwendet. Daher möchte ich eine Methode in Model definieren und die Beschreibung zusammenfassen, um das Element des Benutzers zu erhalten.
Zunächst einmal Controller
ruby:users.controller.rb
def show
@useritems = Item.user_items_get(current_user.id) if user_signed_in?
end
Da "current_user" auf der Modellseite nicht verwendet werden kann, übergeben Sie es als Argument.
Dann Modell
Item.rb
def self.user_items_get(user_bigint)
Item.includes(:images).where(user_id:(user_bigint)).order(id: "DESC")
end
Auf diese Weise wird sogar die Indexaktion von ItemController ausgeführt
ruby:items.cotroller.rb
def index
@useritems = Item.user_items_get(current_user.id).limit(10) if user_signed_in?
end
Es kann so verwendet werden.
Wenn Sie eine Methode in Model schreiben und mit Controller aufrufen möchten, sind Anfänger der Meinung, dass dies eine große Sache ist. Es ist jedoch wichtig, Controller sauber zu machen. Verwenden Sie sie daher bitte. (Die Anzahl der Zeilen in diesem Beispiel hat sich nicht verringert ... lol)
Recommended Posts