web-dev-qa-db-fra.com

Comment faire du contenu statique dans Rails?

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?

72
Timothy T.

penséebot a un plugin appelé high_voltage pour afficher le contenu statique: https://github.com/thoughtbot/high_voltage

30

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'
178
Roland Studer

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

22
Omar Qureshi

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.

13
Tate Johnson

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

2
gkrdvl

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 %>
2
ecleel

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

1
GoodViber