2009-04-22 13 views
7

Voglio creare un CMS come sito in cui l'utente inizia con un alcuni pagine generiche, cioèdinamico CMS come percorsi in Ruby on Rails

  • homepage
  • circa
  • contatto
  • ecc

e da lì possono aggiungere pagine figlio in modo dinamico, ad esempio

  • homepage
    • articoli
      • articolo1
        • qualcosa
          • qualcosa-else
      • article2
  • circa
  • contatto
  • ecc

Per raggiungere questo sto pensando di usare una sorta di associazione di auto-referenziale come

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

L'unica cosa a cui sto combattendo è il percorso gener zione. Poiché le pagine possono essere aggiunte al volo ho bisogno di generare dinamicamente percorsi per queste pagine e non c'è modo di sapere quanti livelli profondi di una pagina può essere nidificato

Quindi, se mi metto fuori con la home page: /

e poi iniziare ad aggiungere pagine cioè

/articoli/articolo1/qualcosa/qualcosa-else/un'altra cosa-

Come può una cosa del genere essere raggiunto con le rotaie di routing modello?

risposta

2

si deve analizzare il percorso da soli

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

Ora si dovrebbe avere un params[:url] disponibili nella vostra azione che è il percorso di richiesta come un array separato dalle barre. Una volta che hai queste corde è semplice trovare i modelli che ti servono da lì.

Questo era da memoria, ed è passato molto tempo. Spero che funzioni per te.

8

Una soluzione a questo problema è caricare dinamicamente i percorsi dai ganci sui modelli.Da esempio, un frammento dal modello Slug sul mio sito:

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 

Questo inserisce il percorso con priorità superiore (0 nella matrice di routing in memoria) dopo che è stato salvato.

Inoltre, sembra che dovresti utilizzare un plug-in per la gestione degli alberi e come un fantastico set annidato o un set nidificato migliore per gestire l'albero per il tuo sito.

0

Guardare alle sorgenti RadiantCMS, implementano tale funzionalità per quanto ne capisco la descrizione.

9

Una volta che avete un modo per generare la stringa URL per i tuoi Page record (e lascio che parte da voi), si può solo mappare ogni pagina in config/routes.rb:

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

e hanno un osservatore agganciare il modello di pagina per ricaricare le rotte quando qualcosa 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 

non dimenticare di modificare config/environment.rb per caricare l'osservatore:

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

Questa è un'ottima soluzione, ma come si converte in rails 3 comandi "match"? – Rumpleteaser

+1

inKit: 'match page.url => 'pagine # mostra',: id => page.id' –

+1

Se stai usando i binari 3, ricarica i tuoi percorsi con' MyApplication :: Application.reload_routes! ' – dhulihan

0

Ho implementato una funzionalità simile in una gemma Rails, utilizzando associazioni autoreferenziali e un albero come interfaccia js per riordinare e nidificare le "pagine".

Il linguaggio dei modelli e l'autenticazione/l'autorizzazione sono lasciati allo sviluppatore da implementare. https://github.com/maca/tiny_cms