Statische Seiten in Ruby on Rails


76

Was ist die Standardmethode zum Erstellen einer Ruby on Rails-Anwendung mit Seiten wie z

  • Zuhause
  • Über
  • Kontakt

Ich würde mich freuen, wenn jemand Links oder Antworten hätte, anstatt nur zu sagen, dass man ein Juwel verwendet, weil ich lernen möchte, wie man einfache Webanwendungen mit einem solchen Verhalten erstellt.

Antworten:


113

Hängt davon ab, wie Sie mit dem Inhalt dieser Seiten umgehen möchten.

Ansatz 1 - Speichern von Inhalten in Ansichten

Wenn Sie nur alle Ihre Inhalte in ERB-Ansichten ablegen möchten, besteht ein sehr einfacher Ansatz darin, eine zu erstellen, PagesControllerderen Zweck darin besteht, statische Seiten zu verarbeiten. Jede Seite wird durch eine Aktion in der Steuerung dargestellt.

pages_controller.rb:

class PagesController < ApplicationController
  def home
  end

  def about
  end

  def contact
  end
end

route.rb:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Erstellen Sie dann die Ansichten home.html.erb, about.html.erb und contact.html.erb unter app / views / pages. Diese Ansichten enthalten den gewünschten Inhalt Ihrer statischen Seiten. Sie verwenden standardmäßig das Layout application.html.erb Ihrer App.

Sie sollten sich auch mit dem Seiten-Caching befassen , um die Leistung zu steigern.


Ansatz 2 - Inhalte in der Datenbank speichern

Ein anderer Ansatz, den ich verwendet habe, besteht darin, ein sehr einfaches CMS für statische Seiten zu erstellen. In diesem Fall werden Seiten im Modell dargestellt. Es verwendet das Juwel "friend_id" , um Slugs für jede Seite so zu behandeln, dass sie durch einen hübschen Namen in der URL (z. B. / about) und nicht durch eine ID abgerufen werden können.

page.rb:

class Page < ActiveRecord::Base
  attr_accessible :title, :content

  validates_presence_of :title, :content

  has_friendly_id :title, :use_slug => true, :approximate_ascii => true
end

pages_controller.rb:

class PagesController < ApplicationController
  def show
    @page = Page.find(params[:id])
    render 'shared/404', :status => 404 if @page.nil?
  end
end

show.html.erb:

<%= raw @page.content %>

route.rb:

match '/:id' => 'pages#show'

Hinweis: Setzen Sie diesen Eintrag am Ende von route.rb, da er mit allem übereinstimmt.

Dann liegt es an Ihnen, wie Sie Seiten erstellen, bearbeiten und aktualisieren möchten - Sie können eine Administrationsoberfläche haben oder sie irgendwie in Ihre öffentliche Oberfläche integrieren. Dieser Ansatz kann auch vom Seiten-Caching profitieren.


8
Sie müssen nicht einmal die leeren Methoden in den Controller aufnehmen. BEARBEITEN: Sie können dies auch als eine Art "Alle abfangen" -Route nach allem anderen setzen: Übereinstimmung ": Aktion" => "Seiten", um zu vermeiden, dass die Routen aktualisiert werden müssen, wenn Sie eine neue Seite hinzufügen. Sie sollten jedoch vorsichtig sein, wenn Sie viele komplizierte Routen haben.
Graham Edgecombe

Vielen Dank Jeff, das war genau richtig! Die Idee, die ich mir vorgestellt hatte, war der 2. Ansatz, aber ich wusste nicht, wie ich so hübsche URLs erstellen sollte. Nochmals vielen Dank!
LuckyLuke

Sie können so etwas wie domain.com/p/blog-post-slug für das Match tun und das dann mit abgleichen /p/:id. P steht für 'post' und kann wirklich alles sein. Ich denke, das ist besser als die Match-Route.
Noah Clark

Was ist :approximate_ascii? Ich kann keine Dokumentation dazu finden. Ich gehe jedoch davon aus, dass ASCII verwendet wird, um das UTF-8-Zeichen zu approximieren, das jetzt Standard ist. github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…
d_rail

1
@page = Page.find(params[:id])sollte geändert werden @page = Page.find_by_id(params[:id])oder Sie erhalten nur die Standard 404 (in der Öffentlichkeit) anstelle Ihrer benutzerdefinierten 404.
d_rail


13

Jeffs Ansatz Nr. 1 (Speichern von Inhalten in Ansichten und Erstellen einer Routen- und Controller-Aktion für jede statische Seite) ist gut. Das einzige, was ich hinzufügen möchte, ist die Verwendung des controllerMakros in Ihren Routen.

Also stattdessen:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

Du kannst das:

controller :pages do
  get :home
  get :about
  get :contact
end

Es sind zwei zusätzliche Zeilen, die jedoch viel eleganter sind, da Wiederholungen vermieden werden und Ihre statischen Seitenrouten visuell gruppiert werden.

Es wird auch die gethttp-Verb-Methode anstelle von verwendet match, was eine bessere Vorgehensweise für Rails-Routen ist (und präziser ist, da in Rails 4 das http-Verb bei der Verwendung angegeben werden mussmatch .


6

Jeffs Ansatz Nr. 1 funktioniert hervorragend für mich. Hier ist ein Trick, mit dem der Controller Seiten dynamisch nachschlagen kann. Damit müssen Sie weder den Controller noch die route.rb berühren, um Seiten hinzuzufügen. Legen Sie einfach die Seiten unter App / Ansichten / Seiten ab und der Controller findet sie.

class PagesController < ApplicationController
  def show
    render params[:id]
  end
end

Das funktioniert bei mir aber nur, wenn ich das Match habe oder in die Routen komme. Muss noch etwas getan werden, um nicht alle Routen in route.rb auflisten zu müssen? mit Schienen 3.2.12
jrich

Seien Sie immer vorsichtig, was Sie mit Benutzereingaben tun. Ich habe dies nicht getestet, habe aber renderZugriff auf jede einzelne Ansicht, sodass ich mir Sorgen um eine machen würde params[:id], die so aussieht admin/whatever. FWIW, Rails rendert automatisch eine Ansicht, ohne eine Controller-Aktion zu erstellen, solange diese Ansicht im Ansichtsordner vorhanden ist, der Ihrem Controller entspricht. Alles, was Sie tun müssen, ist die entsprechende Route hinzuzufügen, was keine große Sache ist.
Richard Jones

6

Schauen Sie sich Michael Hartls http://railstutorial.org an, das in den Versionen 2.3.8 und 3.0.x erhältlich ist. Es behandelt dies mit großartigen Beispielen und führt Sie sehr früh durch deren Erstellung. Außerdem haben Sie die Möglichkeit, viel mehr als dieses Beispiel zu lernen. Ich empfehle es sehr.


Dies kommt jetzt in einer 3.2 und 4.0 Version.
Tag

2

config / route.rb

get ':id', to: 'pages#show'

app / controller / pages_controller.rb

class PagesController < ApplicationController
  def show
    begin
      render params[:id]
    rescue ActionView::MissingTemplate
      render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
    end
  end
end

Platzieren Sie dann Ihre statischen Seiten in app / views / pages / {name} .html.erb (oder einem anderen Vorlagenformat).



0

Eine angemessene Antwort auf Ihre Frage würde im Grunde wie eine Einführung in das Rails-Framework aussehen: zumindest die MVC-Struktur, das Templating und das Routing von DSL. Jeff hat einen guten Stich gegeben, aber seine Antwort setzt immer noch viel grundlegendes Rails-Wissen von Ihrer Seite voraus.

Ich würde jedoch vorschlagen, dass Rails übertrieben sein könnte, wenn Ihre Webanwendung wirklich so einfach ist. Ich würde mir etwas Leichteres ansehen, wie Sinatra , das eine viel geringere Lernkurve als Rails hat und solche Aufgaben hervorragend erledigt, ohne sich mit komplexem Routing, magischem MVC-Action- / Template-Mapping usw. befassen zu müssen.


0

Ich würde vorschlagen, dass Sie Ihre Seiten in den öffentlichen Ordner einfügen, damit sie direkt bereitgestellt werden können, ohne dass Sie durch Schienen gehen müssen. Ich bin jedoch kein Experte, daher bin ich mir nicht sicher, ob dies Nachteile haben könnte, wenn die Seite statisch ist.


1
Dies kann jedoch als rohe Lösung bezeichnet werden. Dies würde es uns nicht ermöglichen, das zu nutzen, was Rails bietet, insbesondere Common Layout Design und Page Caching . Allerdings würde ich diese Lösung nicht vollständig verwerfen.
Sagar Ranglani

1
Diese Technik ist schnell verfügbar, wenn Sie Apache oder Nginx so konfiguriert haben, dass sie die Seiten in Ihrem publicOrdner bereitstellen. Sie verzichtet jedoch auf jede Art von dynamischem Inhalt auf Ihren Seiten, z. B. eine Navigationsleiste, die den Anmelde- / Abmeldestatus des Benutzers anzeigt.
Richard Jones
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.