2009-07-18 13 views
71

Observando las diferentes opciones:¿Cómo hacer contenido estático en Rails?

Una es simplemente poner las páginas estáticas en la carpeta pública /, pero sí quiero que el encabezado del diseño/aplicación sea coherente.

yo probamos este, pero me da un error:

# in routes.rb: 
map.connect '*path', :controller => 'content', :action => 'show' 

# in content_controller.rb: 
def show 
    render :action => params[:path].join('/') 
end 

Todo lo que quiero es una manera fácil de armar cosas como mis páginas de preguntas frecuentes, contacto, tos, privacidad, y otra de tipo no aplicación en alguna parte fácil simplemente creando un .rhtml. quien ha hecho esto?

Respuesta

30

thoughtbot tiene un plugin llamado high_voltage para la visualización de contenido estático: https://github.com/thoughtbot/high_voltage

+4

enlace roto: use: http://github.com/thoughtbot/high_voltage – Jonathan

+0

¡Acabo de agregar esto a un proyecto y funciona muy bien! – Abel

13

Representar una acción no tiene sentido. Querrá renderizar una plantilla (o un archivo) con un diseño.

# 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 

Puede servir una variedad de plantillas diferentes de una sola acción con el almacenamiento en caché de página.

# 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 

Por último, tendremos que definir una ruta.

# config/routes.rb 
map.connect 'static/:path', :controller => 'static', :action => 'show' 

Intente acceder a estas páginas estáticas. Si la ruta no incluye una plantilla válida, presentaremos el archivo 404 y obtendremos un estado 404.

  • http://localhost:3000/static/static1
  • http://localhost:3000/static/static3
  • http://localhost:3000/static/static2

Si se echa un vistazo en app/público se dará cuenta de un/directorio estático con static1.html, static2.html y static3.html . Después de acceder a la página por primera vez, las solicitudes posteriores serán totalmente estáticas gracias al almacenamiento en caché de la página.

+0

¡Justo lo que necesitaba, gracias! – bluediapente

2

Teniendo en cuenta que si tienes 1 Controlador de Inicio con el método pareja como espectáculo, aboutus, privacidad:

class HomesController < ApplicationController 
    def show 
    end 
    def privacy 
    end 
    def aboutus 
    end 
end 

y mapear la demostración del método de la raíz y el mapa de la otra para algunas rutas con nombre como

map.root  :controller => "homes", :action => "show" 
map.aboutus "/aboutus", :controller => "homes", :action => "aboutus" 
map.privacy "/privacy", :controller => "homes", :action => "privacy" 

Y con vista para cada

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 

Todo usando el mismo diseño en app/views /layout/application.html.erb

22

depende de la estructura de la URL, si desea que las rutas salgan de/(p./About_us), entonces:

map.connect ':action', :controller => "static" 

Esto debe ir al final de su archivo de rutas, Lance sus archivos .html.erb en app/views/estáticas y ya está.

e.g: tirando en about_us.html.erb, le dará una página en/about_us.

El elemento que tienes en tu pregunta es ideal para una ruta de todas las capturas, donde puedes analizar la matriz que se te entregó al params[:path].Un poco más información acerca de que al http://railscasts.com/episodes/46-catch-all-route

178

Para Rails5 y Rails4 puede hacer lo siguiente:

Ponga la línea de abajo al final de su routes.rb

get ':action' => 'static#:action' 

Luego pide a raíz /welcom e, representará el /app/views/static/welcome.html.erb.

No olvide crear un controlador "estático", aunque no tenga que poner nada allí.

Para Rails3 usted tiene que utilizar 'partido' en lugar de 'conseguir' solución

match ':action' => 'static#:action' 
+4

+1 Impresionante, justo lo que necesitaba. Esto debería obtener más votos ya que es para los últimos Rails. – spong

+14

Si alguien más se pregunta, la "acción" aquí es mágica; no funcionará si lo llamas ": id" o ": title" o lo que sea. – mahemoff

+1

En Rails4, aparece una alerta en modo de desarrollo que dice reemplazar "coincidencia" por "obtener". – joseph

2

Lindsaar es uno de los mejores que he visto. Construyó un caché de páginas estáticas que expiró cuando la revisión de git cambió.

<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %> 
    <%= render :partial => @page_name %> 
<% end %> 
1

Crear un PagesController para sus páginas estáticas (por ejemplo, contacto) e insertar

def contact_page 
end 

en config/routes.rb insertar

get 'contact' => 'pages#contact_page' 

que mostrará el contenido de las páginas vistas//contact_page.html.erb

+0

¿Por qué el voto a favor? Agradezco que mi respuesta se refiera a Rails 4, pero responderá la pregunta de alguien sin embargo. – GoodViber

Cuestiones relacionadas