Depende de cómo quiera manejar el contenido de esas páginas.
Enfoque n. ° 1: almacenar contenido en vistas
Si solo desea colocar todo su contenido en vistas ERB, entonces un enfoque muy simple es crear un PagesController
cuyo propósito sea tratar con páginas estáticas. Cada página está representada por una acción en el controlador.
pages_controller.rb:
class PagesController < ApplicationController
def home
end
def about
end
def contact
end
end
rutas.rb:
match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'
Luego, cree las vistas home.html.erb, about.html.erb y contact.html.erb en app / views / pages. Estas vistas contienen cualquier contenido que desee en sus páginas estáticas. De forma predeterminada, usarán el diseño application.html.erb de su aplicación.
También querrá examinar el almacenamiento en caché de la página para aumentar el rendimiento.
Enfoque n. ° 2: almacenar contenido en la base de datos
Otro enfoque que he usado es hacer un CMS muy básico para páginas estáticas. En este caso, las páginas están representadas en el modelo. Utiliza la gema friendly_id para manejar los slugs de cada página para que puedan ser recuperados por un bonito nombre en la URL (por ejemplo, / about) en lugar de por ID.
page.rb:
class Page < ActiveRecord::Base
attr_accessible :title, :content
validates_presence_of :title, :content
has_friendly_id :title, :use_slug => true, :approximate_ascii => true
end
pages_controller.rb:
class PagesController < ApplicationController
def show
@page = Page.find(params[:id])
render 'shared/404', :status => 404 if @page.nil?
end
end
show.html.erb:
<%= raw @page.content %>
rutas.rb:
match '/:id' => 'pages#show'
Nota: ponga esta entrada al final de routes.rb ya que coincide con todo.
Entonces, la forma en que desea crear, editar y actualizar las páginas depende de usted: puede tener una interfaz de administración o integrarla en su interfaz pública de alguna manera. Este enfoque también puede beneficiarse del almacenamiento en caché de páginas.
/p/:id
. P es para 'post' y realmente puede ser cualquier cosa. Creo que esto es mejor que la ruta de partido.:approximate_ascii
? No puedo encontrar documentación al respecto. Sin embargo, supongo que usa ASCII para aproximarse al carácter UTF-8, que ahora es el predeterminado. github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…@page = Page.find(params[:id])
debe cambiarse a@page = Page.find_by_id(params[:id])
o simplemente obtendrá el 404 predeterminado (en público) en lugar de su 404. personalizadoOtra opción es la
high_voltage
gema: https://github.com/thoughtbot/high_voltageEsto hace que sea muy fácil crear páginas estáticas donde el contenido se almacena en vistas.
fuente
El enfoque n. ° 1 de Jeff (almacenar contenido en vistas y tener una ruta y una acción de controlador para cada página estática) es bueno. Lo único que agregaría es usar la
controller
macro en sus rutas.Entonces, en lugar de esto:
match '/home' => 'pages#home' match '/about' => 'pages#about' match '/contact' => 'pages#contact'
Puedes hacerlo:
controller :pages do get :home get :about get :contact end
Son dos líneas adicionales, pero mucho más elegantes, ya que elimina la repetición y agrupa visualmente las rutas de las páginas estáticas.
También usa el
get
método del verbo http en lugar dematch
, que es una mejor práctica para las rutas de Rails (y más conciso, ahora que Rails 4 requiere que se especifique el verbo http al usarmatch
.fuente
El enfoque n. ° 1 de Jeff funciona muy bien para mí. Aquí hay un truco para hacer que el controlador busque páginas dinámicamente. Con esto, no es necesario tocar el controlador ni las rutas.rb para agregar páginas. Simplemente suelte las páginas en aplicación / vistas / páginas y el controlador las encontrará.
class PagesController < ApplicationController def show render params[:id] end end
fuente
render
acceso a todas las vistas, por lo que me preocuparíaparams[:id]
que se vea asíadmin/whatever
. FWIW, Rails renderizará automáticamente una vista sin crear una acción de controlador siempre que esa vista exista en la carpeta de vista que corresponde a su controlador. Todo lo que necesita hacer es agregar la ruta adecuada, lo cual no es gran cosa.Consulte http://railstutorial.org de Michael Hartl, que viene en una versión 2.3.8 y 3.0.x. Cubre esto con excelentes ejemplos y lo guía para construirlos desde el principio y también tendrá la oportunidad de aprender mucho más que este ejemplo. Lo recomiendo altamente.
fuente
config / routes.rb
get ':id', to: 'pages#show'
app / controllers / pages_controller.rb
class PagesController < ApplicationController def show begin render params[:id] rescue ActionView::MissingTemplate render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found end end end
Luego, coloque sus páginas estáticas en app / views / pages / {name} .html.erb (o cualquier formato de plantilla).
fuente
Para obtener más información, puede crear páginas estáticas usando Jekyll bootstrap o también Jekyll usando el blog Danger
Referir es muy útil.
fuente
Una respuesta adecuada a su pregunta se vería básicamente como una introducción al marco de Rails: la estructura MVC, plantillas y enrutamiento DSL al menos. Jeff ha dado una buena puñalada, pero su respuesta aún asume una gran cantidad de conocimientos básicos sobre Rails de tu parte.
Sin embargo, sugiero que si su aplicación web es realmente así de simple, Rails podría ser excesivo. Buscaría algo más ligero, como Sinatra , que tiene una curva de aprendizaje mucho más baja que Rails y hace un gran trabajo en este tipo de cosas sin tener que lidiar con enrutamiento complejo, mapeo mágico de acción / plantilla MVC, etc.
fuente
Sugeriría agregar sus páginas en la carpeta pública para que se sirvan directamente sin tener que pasar por rieles en absoluto. Sin embargo, no soy un experto, así que no estoy seguro de si esto podría tener algún inconveniente si la página es estática.
fuente
public
carpeta, pero renuncia a cualquier tipo de contenido dinámico en sus páginas, como una barra de navegación que muestra el estado de inicio / cierre de sesión del usuario.