En regardant différentes options:
La première consiste à simplement mettre les pages statiques dans le dossier public /, mais je veux que l'en-tête de la mise en page/application soit cohérent.
J'ai essayé cela, mais j'ai eu une erreur:
# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'
# in content_controller.rb:
def show
render :action => params[:path].join('/')
end
Tout ce que je veux, c'est un moyen facile de rassembler des choses comme ma FAQ, mes contacts, mes tos, la confidentialité et d'autres pages de type non-application quelque part facilement en créant simplement un .rhtml. qui a fait ça?
penséebot a un plugin appelé high_voltage pour afficher le contenu statique: https://github.com/thoughtbot/high_voltage
Pour Rails5 et Rails4, vous pouvez effectuer les opérations suivantes:
Mettez la ligne ci-dessous à la fin de vos itinéraires.rb
get ':action' => 'static#:action'
Ensuite, les demandes à root/welcome , rendront le /app/views/static/welcome.html.erb .
N'oubliez pas de créer un contrôleur 'statique', même si vous n'avez rien à y mettre.
Pour Rails vous devez utiliser 'match' au lieu de 'get'
match ':action' => 'static#:action'
dépend de la structure de l'url, si vous voulez que les chemins se détachent de/(par exemple/about_us), alors:
map.connect ':action', :controller => "static"
Cela devrait aller à la fin de votre fichier de routes, jetez vos fichiers .html.erb dans app/views/static et vous avez terminé.
par exemple: ajouter about_us.html.erb
, vous donnera une page sur/about_us.
L'élément que vous avez dans votre question est idéal pour un itinéraire fourre-tout où vous pouvez analyser le tableau qui vous est donné à params[:path]
. Un peu plus d'informations à ce sujet sur http://railscasts.com/episodes/46-catch-all-route
Rendre une action n'a pas de sens. Vous voudrez rendre un modèle (ou un fichier) avec une mise en page.
# 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
Vous pouvez servir une variété de modèles différents à partir d'une seule action avec mise en cache des pages.
# 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
Enfin, nous devrons définir un itinéraire.
# config/routes.rb
map.connect 'static/:path', :controller => 'static', :action => 'show'
Essayez d'accéder à ces pages statiques. Si le chemin n'inclut pas de modèle valide, nous rendrons le fichier 404 et retournerons un état 404.
http://localhost:3000/static/static1
http://localhost:3000/static/static3
http://localhost:3000/static/static2
Si vous jetez un œil dans app/public, vous remarquerez un répertoire statique/avec static1.html, static2.html et static3.html. Après avoir accédé à la page pour la première fois, toutes les demandes suivantes seront entièrement statiques grâce à la mise en cache de la page.
Considérant que si vous avez 1 Home Controller avec une méthode de couple comme show, aboutus, privacy:
class HomesController < ApplicationController
def show
end
def privacy
end
def aboutus
end
end
Et mappez la méthode show à votre racine et mappez l'autre à des routes nommées comme
map.root :controller => "homes", :action => "show"
map.aboutus "/aboutus", :controller => "homes", :action => "aboutus"
map.privacy "/privacy", :controller => "homes", :action => "privacy"
Et avec vue pour chacun
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
Tous utilisant la même mise en page dans app/views/layout/application.html.erb
Lindsaar la solution est l'une des meilleures que j'ai jamais vues. Il a construit une mise en cache des pages statiques qui ont expiré lorsque la révision de git a changé.
<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
<%= render :partial => @page_name %>
<% end %>
Créez un PagesController pour vos pages statiques (par exemple contact) et insérez
def contact_page
end
dans le fichier config/routes.rb
get 'contact' => 'pages#contact_page'
qui affichera le contenu des vues/pages/contact_page.html.erb