Willkommens- / Homepage in Ruby on Rails - Best Practice

80

Meine Homepage (oder Begrüßungsseite) besteht aus Daten von zwei Modellen (nennen wir sie Autoren und Beiträge). Ich bin neu in Schienen und nicht sicher, wie ich das am besten erreichen kann.

Sollte ich einen neuen Controller namens Welcome erstellen, der Daten von Autoren und Posts sammelt und diese dann in der Begrüßungsindexansicht anzeigt? Oder sollte ich unter dem Post-Modell eine willkommene Ansicht haben, die auch Daten von Autoren erhält? Oder eine andere Möglichkeit, dies zu erreichen?

Ich verstehe, wie man das alles technisch macht, bin mir aber nicht sicher, welche Best-Practice-Methode das Rails-Framework verwendet.

Espen
quelle

Antworten:

51

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 Staticerstellen, 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.

Robert K.
quelle
Das Schreiben @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 des PostControllers enthalten ist index. Gibt es einen besseren (modulareren) Weg, der den bereits geschriebenen Code der Aktion des PostControllers verwendet index?
LazerSharks
125

Es scheint keine einzige bewährte Methode zu geben.

(1) Die Standarddatei config/routes.rbscheint vorzuschlagen, dass die Stammseite (oder die Startseite / Begrüßungsseite) von verwaltet werden sollte welcome#index. Wenn Sie sich davon leiten lassen und den entsprechenden welcome#indexController / die entsprechende Aktion generieren möchten, können Sie den folgenden Befehl verwenden:

rails generate controller Welcome index

Anschließend können Sie in config/routes.rbdie get "welcome/index"vom Generator automatisch hinzugefügte GET-Route ( ) entfernen und die Root-Route root 'welcome#index'(oder root :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.htmlin Rails zu löschen < 4.

(2) Der offizielle Ruby on Rails-Routing-Leitfaden verwendet PagesController. Es schlägt tatsächlich vor pages#main, obwohl es für mich sinnvoller ist, damit zu arbeiten pages#home(weil "Homepage" der allgegenwärtige Begriff / das allgegenwärtige Konzept ist). Zusätzlich kann dieser Controller andere behandeln seitenorientierte Aktionen wie pages#about, pages#contact, pages#terms, pages#privacy, usw.

(3) Das Ruby on Rails-Tutorial passt zu static_pages#homeund static_pages#helpusw., 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.

user664833
quelle
12
Schöne Antwort, ich werde 2) Seiten # nach Hause wählen.
Neeraj
3
IMHO sollte diese Antwort von @ user664833 die akzeptierte Antwort sein. Klar recherchierte und überlegte Logik ausdrücken.
Betjamin Richards
29

Ich habe mich so etwas gefragt, als ich Rails zum ersten Mal gestartet habe. Folgendes müssen Sie wissen:

  • Modelle stehen nicht unbedingt in direktem Zusammenhang mit Controllern und Ansichten.

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

John
quelle
10
Was ist Ihre Antwort auf die Frage?
Mark Wilden
Anstatt mit anderen Antworten zu konkurrieren (die direkter mit dem vorliegenden Problem des Fragestellers zusammenhängen), hängt dies mit einem Missverständnis zusammen , das John dem Fragesteller vorstellt . Das ist nützlich. Es gibt keinen Grund für John, das zu wiederholen, was andere gesagt haben, um einen Aspekt der Frage anzusprechen, den sie nicht angesprochen haben.
Bilderstürmer
11

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.

allesklar
quelle
9

Bitte beachten Sie, dass in Rails3 die korrekte Vorgehensweise darin besteht, die folgende Zeile am Ende der Datei route.rb einzufügen:

root :to => "welcome#index"

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:

class WelcomeController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end
irakli
quelle
1
Sollte es sich nicht um einen "Willkommens" -Controller oder um eine einzelne Ressource handeln, verwenden Sie die Show-Aktion.
gefährliche
9

Diese Antwort ist ab Rails 3.2.1.

Richten Sie zunächst einen Controller für Seiten ein, der beispielsweise Folgendes enthält static:

$ rails generate controller static

In Datei app/controllers/static_controller.rb:

class StaticController < ApplicationController
    def index       
    end
end

Erstellen Sie die neue Ansichtsdatei app/views/index.html.erb

Und schließlich konfigurieren Sie Ihre config/routes.rb:

MyApp::Application.routes.draw do
   match 'home', :to => "static#index"
   root :to => "static#index"
end

Dies macht beides /homeund /geht zu dem, was Sie in die soeben erstellte Ansichtsdatei eingefügt haben.

Naoise Golden
quelle
Sehr schöne Lösung! Ich bin pingelig, aber ich würde vorschlagen, die zweite Zeile zu lesenmatch 'home' => 'static#index'
Anconia
6

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.

Mike Woodhouse
quelle