2009-04-22 37 views
7

Tôi muốn tạo ra một CMS như trang web mà người dùng bắt đầu với một số trang chung chung, tức làđộng CMS như tuyến đường trong Ruby on Rails

  • trang chủ
  • về
  • xúc
  • vv

và từ đó có thể thêm trang con động, ví dụ:

  • trang chủ
    • điều
      • Điều 1
        • một cái gì đó
          • một cái gì đó-else
      • article2
  • về
  • xúc
  • vv

Để đạt được điều này tôi đang lập kế hoạch về việc sử dụng một số loại hiệp hội tự tham chiếu như

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

Điều tôi đang đấu tranh là các tuyến đường ation. Bởi vì bạn có thể thêm một cách nhanh chóng tôi cần phải tự động tạo các tuyến đường cho các trang này và không có cách nào để biết có bao nhiêu cấp độ sâu một trang có thể được lồng vào nhau

Vì vậy, nếu tôi bắt đầu với trang chủ: /

và sau đó bắt đầu thêm các trang tức là

/bài báo/điều 1/cái gì đó/cái gì đó-else/khác-điều

Làm thế nào một cái gì đó như thế có thể đạt được với các đường ray mô hình định tuyến?

Trả lời

2

Bạn cần phải phân tích con đường mình

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

Bây giờ bạn nên có một params[:url] sẵn trong hành động của bạn đó là con đường yêu cầu như một mảng ngăn cách bởi dấu gạch chéo. Một khi bạn có những chuỗi của nó một vấn đề đơn giản để tìm các mô hình bạn cần từ đó.

Đó là từ bộ nhớ và đã lâu rồi. Hi vọng nó sẽ giúp ích cho bạn.

8

Một giải pháp cho prob này là tải động các tuyến từ móc trên mô hình của bạn.Từ ví dụ, một đoạn từ Slug mô hình trên trang web của tôi:

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 

này chèn đường bay tại ưu tiên hàng đầu (0 trong mảng định tuyến trong bộ nhớ) sau khi nó đã được lưu.

Ngoài ra, có vẻ như bạn nên sử dụng plugin quản lý cây và giống như bộ lồng nhau tuyệt vời hoặc bộ lồng nhau tốt hơn để quản lý cây cho trang web của bạn.

0

Nhìn vào các nguồn RadiantCMS, chúng triển khai chức năng đó theo như tôi hiểu mô tả tự của chúng.

9

Một khi bạn có một số cách để tạo ra chuỗi URL cho Page hồ sơ của bạn (và tôi sẽ để lại một phần tùy thuộc vào bạn), bạn chỉ có thể lập bản đồ tất cả các trang trong config/routes.rb:

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

Và có một quan sát viên treo mô hình trang để tải lại các tuyến đường khi có điều gì thay đổi:

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 

Đừng quên để chỉnh sửa config/environment.rb để tải người quan sát:

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

Đó là một giải pháp tuyệt vời, nhưng làm cách nào bạn chuyển đổi nó thành các lệnh phù hợp với 3 đường ray? – Rumpleteaser

+1

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

+1

Nếu bạn đang sử dụng đường ray 3, hãy tải lại tuyến đường của bạn bằng' MyApplication :: Application.reload_routes! ' – dhulihan

0

Tôi đã triển khai chức năng tương tự thành đá quý Rails, sử dụng liên kết tự tham chiếu và giao diện cây như giao diện js để sắp xếp lại và lồng "trang".

Ngôn ngữ tạo mẫu và xác thực/ủy quyền được để lại cho nhà phát triển triển khai. https://github.com/maca/tiny_cms