Die Frage ist, ist Ihre Homepage nur eine Zielseite oder wird es eine Gruppe von Seiten sein? Wenn es sich nur um eine Zielseite handelt, erwarten Sie nicht, dass Ihre Benutzer lange dort herumhängen, außer woanders hinzugehen. Wenn es sich um eine Gruppe von Seiten handelt oder einer vorhandenen Gruppe ähnelt, können Sie dem Controller, dem er am ähnlichsten ist, eine Aktion hinzufügen.
Was ich für mein aktuelles Projekt getan habe, ist einen Controller mit dem Namen zu Static
erstellen, da ich 3 statische Seiten benötige. Die Homepage ist eine davon, da es nichts zu sehen oder zu tun gibt, außer woanders hinzugehen.
Verwenden Sie Folgendes, um eine Standardroute zuzuordnen routes.rb
:
# Place at the end of the routing!
map.root :controller => 'MyController', :action => :index
In meinem Fall wäre dies:
map.root :controller => 'static', :action => :index
Wenn Sie möchten, können Sie einen Controller nur für diese Homepage erstellen. Ich würde es main nennen oder etwas, an das Sie sich erinnern können, das sich auf die Homepage bezieht. Von dort aus können Sie Ihre Daten und Modelle abrufen und auf die Ausgabeansicht zurückgreifen.
class MainController < ApplicationController
def index
@posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
end
end
Angenommen, Sie haben Ihre Modellbeziehungen korrekt definiert, ist die entsprechende Vorlage sehr einfach.
Viel Glück, hoffe das hilft.
@posts = Posts.find( ...
oder@posts = Posts.all
ähnliches in diesem neuen Controller / dieser neuen Aktion würde also nicht als Verstoß gegen die DRY-Prinzipien angesehen, obwohl ein solcher Code möglicherweise bereits in der Aktion desPost
Controllers enthalten istindex
. Gibt es einen besseren (modulareren) Weg, der den bereits geschriebenen Code der Aktion desPost
Controllers verwendetindex
?Es scheint keine einzige bewährte Methode zu geben.
(1) Die Standarddatei
config/routes.rb
scheint vorzuschlagen, dass die Stammseite (oder die Startseite / Begrüßungsseite) von verwaltet werden solltewelcome#index
. Wenn Sie sich davon leiten lassen und den entsprechendenwelcome#index
Controller / die entsprechende Aktion generieren möchten, können Sie den folgenden Befehl verwenden:Anschließend können Sie in
config/routes.rb
dieget "welcome/index"
vom Generator automatisch hinzugefügte GET-Route ( ) entfernen und die Root-Routeroot 'welcome#index'
(oderroot :to => 'welcome#index'
in Rails< 4
) oben in der Datei platzieren, da dies wahrscheinlich Ihre beliebteste Route ist und zuerst abgeglichen werden sollte.Denken Sie auch daran,
public/index.html
in Rails zu löschen< 4
.(2) Der offizielle Ruby on Rails-Routing-Leitfaden verwendet
PagesController
. Es schlägt tatsächlich vorpages#main
, obwohl es für mich sinnvoller ist, damit zu arbeitenpages#home
(weil "Homepage" der allgegenwärtige Begriff / das allgegenwärtige Konzept ist). Zusätzlich kann dieser Controller andere behandeln seitenorientierte Aktionen wiepages#about
,pages#contact
,pages#terms
,pages#privacy
, usw.(3) Das Ruby on Rails-Tutorial passt zu
static_pages#home
undstatic_pages#help
usw., obwohl mir die Idee, diesen Controller mit "statisch" zu kennzeichnen , nicht gefällt. Diese Seiten werden wahrscheinlich noch einige dynamische Aspekte haben, insbesondere die Homepage!(4) Obwohl nicht erläutert wird , wie mit einer Homepage umgegangen werden soll , schlägt RailsCast # 117 auf semistatischen Seiten noch weitere Ansätze vor, um nur Ressourcen anzuzeigen.
Ich habe die Vorliebe für 1 und / oder 2. Mit dem Szenario "und" könnten Sie den Begrüßungsindex und die Seiten # über usw. verwenden, während Sie mit dem Szenario "oder" die Seiten # home, pages # about, verwenden könnten. usw. Wenn ich gezwungen wäre zu wählen, würde ich Option 2 wählen, nur weil Sie am Ende weniger Code haben. Übrigens sind 2 und 3 bis auf das Wort "statisch" ziemlich gleich.
quelle
Ich habe mich so etwas gefragt, als ich Rails zum ersten Mal gestartet habe. Folgendes müssen Sie wissen:
Das heißt, eine bestimmte Controller / Ansicht-Kombination kann mit so vielen Modellen arbeiten, wie Sie zum Generieren dieser bestimmten Seite benötigen.
Der Zweck des Controllers besteht darin, den anzuzeigenden Datensatz vorzubereiten, unabhängig davon, welche Modelle zum Speichern dieser Daten verwendet werden.
Der Zweck der Ansicht besteht darin, diese Daten auf die am besten geeignete Weise anzuzeigen.
Mit anderen Worten, Controller / Ansicht-Kombinationen befinden sich niemals unter einem bestimmten Modell. Sie verwenden Modelle, stehen jedoch in keiner hierarchischen Beziehung unter ihnen. Tatsächlich sind sie Peers zu allen Modellen, die sie verwenden.
Ich denke, die Verwirrung kommt von dem Beispiel eines Gerüstgenerators, das in AWDR und anderen einleitenden Texten zu finden ist, wie:
Ruby Script / Scaffold Model Controller generieren
Ich weiß, dass mich diese implizite Beziehung zwischen Modell und Controller / Ansichten ein wenig verwirrt hat. Aber es gibt wirklich keine strenge Beziehung. Wenn dies der Fall wäre, wäre es sehr schwierig, mit dem MVC-Ansatz etwas Kompliziertes zu tun. Und das ist natürlich nicht der Fall.
Hoffe das hilft.
-- John
quelle
Die beste Vorgehensweise wäre Ihr erster Vorschlag. Erstellen Sie einen Willkommens-Controller und rufen Sie die Datensätze der gewünschten Modelle auf. Haben Sie einen Root-Routenpunkt zu diesem Controller. Sehr sauber und ordentlich.
quelle
Bitte beachten Sie, dass in Rails3 die korrekte Vorgehensweise darin besteht, die folgende Zeile am Ende der Datei route.rb einzufügen:
und löschen Sie public / index.html.erb.
Bitte beachten Sie auch, dass der Welcome # Index der Indexaktion in einem WelcomeController entspricht und der Code aus der Antwort von The Wicked Flea folgendermaßen aussehen würde:
quelle
Diese Antwort ist ab Rails 3.2.1.
Richten Sie zunächst einen Controller für Seiten ein, der beispielsweise Folgendes enthält
static
:In Datei
app/controllers/static_controller.rb
:Erstellen Sie die neue Ansichtsdatei
app/views/index.html.erb
Und schließlich konfigurieren Sie Ihre
config/routes.rb
:Dies macht beides
/home
und/
geht zu dem, was Sie in die soeben erstellte Ansichtsdatei eingefügt haben.quelle
match 'home' => 'static#index'
Erstellen Sie einen neuen Controller mit dem passenden Namen. SummaryController? StartController? DailyFrontPageController? Du wirst eine Idee haben.
Darüber hinaus würde ich ernsthaft in Betracht ziehen, ein neues Modell zu erstellen, das nicht auf ActiveRecord basiert und die Informationen aus Ihren Autoren- und Post-Modellen (oder wie auch immer ihre tatsächlichen Namen lauten) zur Präsentation in Ihrer Ansicht sammelt. Die Alternative besteht darin, die Daten im Controller zusammenzustellen, was mit ziemlicher Sicherheit chaotisch sein wird - es war jedes Mal, wenn ich es versuchte, und ich habe es oft versucht. Ein separates Modell scheint viel aufgeräumter zu sein.
Wenn die Verarbeitung relativ einfach ist, versuchen Sie, zuerst die Daten in der Steuerung zu erstellen, dann die Ausgabe in eine Struktur zu verpacken, dann die Struktur durch eine echte Klasse zu ersetzen und die Konstruktion dorthin zu verschieben, wobei Sie den gesamten Weg umgestalten. Es sollte nicht zu viel zur Gesamtzeit beitragen (der größte Teil des Codes kann wiederverwendet werden), und Sie erhalten eine gute Vorstellung davon, was für Sie am besten funktioniert.
quelle