Verschiedene Optionen betrachten:
Eine besteht darin, die statischen Seiten einfach in den Ordner public/zu stellen, aber ich möchte, dass der Header von layout/application konsistent ist.
Ich habe es versucht, aber ich habe einen Fehler bekommen:
# 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 FAQ, Kontakt, Nutzungsbedingungen, Datenschutz und andere nicht anwendungsbezogene Seiten einfach zusammenzustellen, indem ich einfach eine .rhtml-Datei erstelle. wer hat das gemacht
thoughtbot hat ein Plugin namens high_voltage zum Anzeigen statischer Inhalte: https://github.com/thoughtbot/high_voltage
Für Rails5 und Rails4 können Sie Folgendes tun:
Fügen Sie die Zeile unten am Ende Ihrer Route ein
get ':action' => 'static#:action'
Dann werden Anfragen an root/welcome die Datei /app/views/static/welcome.html.erb .
Vergessen Sie nicht, einen 'statischen' Controller zu erstellen, auch wenn Sie dort nichts einfügen müssen.
Für Rails musst du 'match' anstelle von 'get' verwenden
match ':action' => 'static#:action'
abhängig von der URL-Struktur, wenn Sie möchten, dass die Pfade von/(z. B./about_us) kommen, dann:
map.connect ':action', :controller => "static"
Dies sollte ganz am Ende Ihrer Routendatei stehen. Werfen Sie Ihre .html.erb-Dateien in app/views/static und Sie sind fertig.
z. B .: Einwerfen von about_us.html.erb
, gibt Ihnen eine Seite bei/about_us.
Der Gegenstand, den Sie in Ihrer Frage haben, eignet sich hervorragend für eine Fangroute, auf der Sie das Array analysieren können, das Ihnen unter params[:path]
. Ein bisschen mehr Informationen dazu unter http://railscasts.com/episodes/46-catch-all-route
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 einen Blick in app/public werfen, 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 Seiten-Caching vollständig statisch.
Überlegen Sie, ob Sie 1 Home-Controller mit Paarmethode 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 Root zu, und ordnen Sie die andere einigen benannten Routen zu, 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 für 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
Lindsaar Die Lösung ist eine der besten, die ich je gesehen habe. Er hat eine statische Cacheseite erstellt, die abgelaufen ist, als die Revision des Git geändert wurde.
<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
<%= render :partial => @page_name %>
<% end %>
Erstellen Sie einen PagesController für Ihre statischen Seiten (z. B. Kontakt) und fügen Sie sie ein
def contact_page
end
in config/routes.rb einfügen
get 'contact' => 'pages#contact_page'
daraufhin wird der Inhalt von views/pages/contact_page.html.erb angezeigt