2009-04-22 46 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