Verschiedene Optionen betrachten:
Eine besteht darin, nur die statischen Seiten in den Ordner public / zu legen, aber ich möchte, dass der Header von Layout / Anwendung konsistent ist.
Ich habe es versucht, aber ich habe eine Fehlermeldung erhalten:
# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'
# in content_controller.rb:
def show
render :action => params[:path].join('/')
end
Alles, was ich möchte, ist eine einfache Möglichkeit, Dinge wie meine FAQ, Kontakt, tos, Datenschutz und andere Seiten, die keine Anwendung sind, an einem einfachen Ort zusammenzustellen, indem Sie einfach eine .rhtml erstellen. Wer hat das getan?
quelle
hängt von der URL-Struktur ab, wenn Sie möchten, dass die Pfade von / (zB / about_us) abweichen, dann:
map.connect ':action', :controller => "static"
Dies sollte ganz am Ende Ihrer Routendatei erfolgen. Werfen Sie Ihre .html.erb-Dateien in app / views / static und Sie sind fertig.
Beispiel:
about_us.html.erb
Wenn Sie einwerfen, erhalten Sie eine Seite unter / about_us.Das Element, das Sie in Ihrer Frage haben, eignet sich hervorragend für eine Catch-All-Route, auf der Sie das Array analysieren können, unter dem Sie sich befinden
params[:path]
. Weitere Informationen hierzu finden Sie unter http://railscasts.com/episodes/46-catch-all-routequelle
Das Rendern einer Aktion macht keinen Sinn. Sie möchten eine Vorlage (oder eine Datei) mit einem Layout rendern.
# Path relative to app/views with controller's layout render :template => params[:path] # ... OR # Absolute path. You need to be explicit about rendering with a layout render :file => params[:path], :layout => true
Sie können eine Vielzahl verschiedener Vorlagen aus einer einzigen Aktion mit Seiten-Caching bereitstellen.
# app/controllers/static_controller.rb class StaticController < ApplicationController layout 'static' caches_page :show def show valid = %w(static1 static2 static3) if valid.include?(params[:path]) render :template => File.join('static', params[:path]) else render :file => File.join(Rails.root, 'public', '404.html'), :status => 404 end end end
Zuletzt müssen wir eine Route definieren.
# config/routes.rb map.connect 'static/:path', :controller => 'static', :action => 'show'
Versuchen Sie, auf diese statischen Seiten zuzugreifen. Wenn der Pfad keine gültige Vorlage enthält, wird die 404-Datei gerendert und ein 404-Status zurückgegeben.
http://localhost:3000/static/static1
http://localhost:3000/static/static3
http://localhost:3000/static/static2
Wenn Sie in app / public nachsehen, werden Sie ein static / -Verzeichnis mit static1.html, static2.html und static3.html bemerken. Nach dem ersten Zugriff auf die Seite sind alle nachfolgenden Anforderungen dank des Seiten-Caching vollständig statisch.
quelle
Überlegen Sie, ob Sie 1 Home Controller mit paar Methoden wie show, aboutus, privacy haben:
class HomesController < ApplicationController def show end def privacy end def aboutus end end
Und ordnen Sie die show-Methode Ihrem Stamm zu, und ordnen Sie die andere einigen benannten Routen wie z
map.root :controller => "homes", :action => "show" map.aboutus "/aboutus", :controller => "homes", :action => "aboutus" map.privacy "/privacy", :controller => "homes", :action => "privacy"
Und mit Blick auf jeden
app/views/homes/aboutus.html.erb --> you get http://localhost:3000/aboutus app/views/homes/show.html.erb --> you get http://localhost:3000 (root) app/views/homes/privacy.html.erb --> you get http://localhost:3000/privacy
Alle verwenden dasselbe Layout unter app / views / layout / application.html.erb
quelle
Die Lindsaar- Lösung ist eine der besten, die ich je gesehen habe. Er erstellt statische Caching-Seiten, die abgelaufen sind, als sich die Git-Revision geändert hat.
<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %> <%= render :partial => @page_name %> <% end %>
quelle
Erstellen Sie einen PagesController für Ihre statischen Seiten (z. B. Kontakt) und fügen Sie ihn ein
def contact_page end
in config / route.rb einfügen
get 'contact' => 'pages#contact_page'
Dadurch wird der Inhalt von views / pages / contact_page.html.erb angezeigt
quelle
Ich habe die Idee eines verallgemeinerten Controllers aus den gegebenen Antworten verwendet, aber ich wollte 404s fangen, also habe ich eine Aktion eingefügt, um beide Fälle zu behandeln:
# app/controllers/static_controller.rb class StaticController < ApplicationController def static_or_404 render params[:static] rescue ActionView::MissingTemplate render :not_found end end
und dann ganz unten in meinem Routing:
# config/routes.rb get '*static', to: 'static#static_or_404'
Es dient der Ansicht
app/views/static
mit demselben Namen wie der Pfad, und wenn es keine solche Ansicht gibt, dient esapp/views/static/not_found.html.erb
. Man könnte auch ersetzenrender :not_found
mitredirect_to root_path
oder irgendetwas anderes wollte passieren lassen.quelle