2009-04-22 13 views
7

Quiero crear un CMS como sitio donde el usuario comienza con un algunas páginas genéricas, es decirdinámico CMS como rutas en Ruby on Rails

  • página
  • sobre
  • contacto
  • etc.

y desde allí se puede agregar páginas secundarias de forma dinámica, por ejemplo

  • página
    • artículos
      • artículo 1
        • algo
          • algo, otra cosa
      • artículo 2
  • sobre
  • contacto
  • etc

Para lograr esto, estoy planeando sobre el uso de algún tipo de asociación autorreferencial como

class Page < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'Page' 
    has_many :children, :class_name => 'Page' 
end 

Lo único con lo que estoy luchando es la ruta general ación. Debido a que las páginas se pueden añadir sobre la marcha lo que necesito para generar dinámicamente rutas de estas páginas y no hay forma de saber cuántos niveles de profundidad una página puede estar anidada

Así que si comienzo con la página de inicio: /

y luego empezar a añadir páginas, es decir,

/artículos/Artículo 1/algo/algo-else/otra cosa-

¿Cómo puede algo así puede lograr con los carriles modelo de enrutamiento?

Respuesta

2

Usted tiene que analizar la ruta mismo

map.connect '*url', :controller => 'pages', :action => 'show' 

Ahora usted debería tener un params[:url] disponibles en su acción que es la ruta de solicitud como una matriz separada por las barras. Una vez que tenga esas cuerdas, es una cuestión simple para encontrar los modelos que necesita desde allí.

Eso fue de memoria, y ha pasado mucho tiempo. Espero que funcione para ti.

8

Una solución a este problema es cargar dinámicamente rutas de ganchos en sus modelos.Desde ejemplo, un fragmento del modelo Slug en mi sitio:

class Slug < ActiveRecord::Base 

    belongs_to :navigable 

    validates_presence_of :name, :navigable_id 
    validates_uniqueness_of :name 

    after_save :update_route 

    def add_route 
    new_route = ActionController::Routing::Routes.builder.build(name, route_options) 
    ActionController::Routing::Routes.routes.insert(0, new_route) 
    end 

    def remove_route 
    ActionController::Routing::Routes.routes.reject! { |r| r.instance_variable_get(:@requirements)[:slug_id] == id } 
    end 

    def update_route 
    remove_route 
    add_route 
    end 

    def route_options 
    @route_options ||= { :controller  => navigable.controller, 
         :action   => navigable.action, 
         :navigable_id => navigable_id, 
         :slug_id  => id } 
    end 

end 

Esto inserta la ruta en la parte superior de prioridad (0 en la matriz de enrutamiento en la memoria) después de que se ha guardado.

Además, parece que debe utilizar un complemento de administración de árbol y un conjunto anidado impresionante o un mejor conjunto anidado para administrar el árbol de su sitio.

0

Mira las fuentes de RadiantCMS, implementan esa funcionalidad por lo que yo entiendo su propia descripción.

9

Una vez que tenga alguna manera de generar la cadena de URL para sus registros Page (y voy a dejar esa parte de usted), sólo puede asignar cada página en config/routes.rb:

Page.all.each do |page| 
    map.connect page.url, :controller => 'pages', :action => 'show', :id => page 
end 

y tienen una observador enganchar el modelo para recargar la página rutas cuando algo cambia:

class PageObserver < ActiveRecord::Observer 
    def reload_routes(page) 
    ActionController::Routing::Routes.reload! 
    end 
    alias_method :after_save, :reload_routes 
    alias_method :after_destroy, :reload_routes 
end 

no se olvide de editar config/environment.rb para cargar el observador:

# Activate observers that should always be running 
config.active_record.observers = :page_observer 
+0

Esa es una gran solución, pero ¿cómo la convertirías a los rieles 3 comandos de 'coincidencia'? – Rumpleteaser

+1

inKit: 'match page.url => 'pages # show',: id => page.id' –

+1

Si está utilizando rails 3, vuelva a cargar sus rutas con' MyApplication :: Application.reload_routes! ' – dhulihan

0

Implementé una funcionalidad similar en una gema de Rails, utilizando asociaciones autorreferenciales y una interfaz de árbol como js para reordenar y anidar las "páginas".

El lenguaje de programación y la autenticación/autorización se dejan para que el desarrollador implemente. https://github.com/maca/tiny_cms