2009-04-22 77 views
7

我想創建一個CMS像網站紅寶石路線,其中用戶開始了與一些通用的網頁,即動態CMS像在軌道上

  • 首頁
  • 接觸

,並從那裏可以動態地添加子頁面,例如

  • 首頁
    • 文章
      • 第一條
        • 東西
          • 東西,別的
      • 第二條
  • 接觸

要做到這一點,我打算使用某種自我指涉的關聯像

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

我正在努力的一件事是路線生成通貨膨脹。因爲網頁可以在飛行中加入我需要動態地生成這些頁面的路線並沒有知道多少級深的頁面可以被嵌套

所以,如果我開始了與網頁的方式: /

,然後開始添加頁面,即

/用品/第一條/某事/東西,否則/另一個,事情

怎麼能這樣的事情與軌道路由模式來實現?

回答

2

你必須分析自己

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

現在,你應該在你的行動,是由斜槓分隔的數組的請求路徑中提供params[:url]的路線。一旦你有了這些字符串,就可以從這裏找到你需要的模型。

這是來自記憶,它已經很久了。希望對你有效。

8

解決此問題的一種方法是從模型上的掛鉤動態加載路由。從例如,從我的網站上Slug模型的一個片段:

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 

這將插入已保存後(在內存中的路由陣列0)在重中之重的路線。

此外,它聽起來像你應該使用樹管理插件和像真棒嵌套集或更好的嵌套集來管理您的網站的樹。

0

看看RadiantCMS的來源,他們實現了這個功能,據我瞭解他們的自我描述。

9

一旦你有一些方法來爲您的Page記錄URL字符串(我會離開的那部分由你),你可以映射config/routes.rb每一頁:

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

,並有觀察者掛鉤頁面模型重新加載路由時有新的變化:

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 

不要忘記編輯config/environment.rb加載觀察員:

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

這是一個很好的解決方案,但如何將它轉換爲rails 3'match'命令? – Rumpleteaser 2012-03-12 09:09:23

0

我已經在Rails gem中實現了類似的功能,使用自引用關聯和像js接口這樣的樹來重新排序和嵌套「頁面」。

模板語言和認證/授權留給開發人員實施。 https://github.com/maca/tiny_cms