Динамические CMS как маршруты в ruby ​​на рельсах - PullRequest
7 голосов
/ 22 апреля 2009

Я хочу создать сайт, похожий на CMS, где пользователь начинает с общих страниц, т. Е.

  • Домашняя страница
  • о
  • контакт
  • и т.д.

и оттуда можно динамически добавлять дочерние страницы, например

  • домашняя страница
    • статьи
      • Article1
        • что-то
          • что-то-то еще
      • * 1030 Статья 2 *
  • о
  • контакт
  • и т.д.

Для достижения этой цели я планирую использовать какую-то самореференциальную ассоциацию, такую ​​как

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

Единственное, с чем я борюсь - это генерация маршрута. Поскольку страницы могут быть добавлены на лету, мне нужно динамически генерировать маршруты для этих страниц, и нет никакого способа узнать, сколько уровней глубоко может быть вложено в страницу

Так что, если я начну с домашней страницы: /

и затем начните добавлять страницы, т.е.

/ статьи / Article1 / что-то / что-то-другое / другое-вещь

Как чего-то подобного можно достичь с помощью модели маршрутизации рельсов?

Ответы [ 5 ]

9 голосов
/ 30 апреля 2009

Если у вас есть какой-то способ сгенерировать строку URL для ваших Page записей (и я оставлю эту часть на ваше усмотрение), вы можете просто отобразить каждую страницу в 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
8 голосов
/ 22 апреля 2009

Одним из решений этой проблемы является динамическая загрузка маршрутов из хуков на ваших моделях. Например, фрагмент из модели 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 в массиве маршрутизации в памяти) после его сохранения.

Кроме того, звучит так, как будто вы должны использовать плагин для управления деревом и, как удивительный вложенный набор или лучший вложенный набор для управления деревом для вашего сайта.

2 голосов
/ 22 апреля 2009

Вы должны разобрать маршрут самостоятельно

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

Теперь в вашем действии должен быть доступен params[:url], представляющий собой путь запроса в виде массива, разделенного косыми чертами. Если у вас есть эти строки, то легко найти нужные модели оттуда.

Это было по памяти, и это было давно. Надеюсь, это работает для вас.

0 голосов
/ 27 октября 2010

Я реализовал аналогичную функциональность в геме Rails, используя самоссылочные ассоциации и древовидный интерфейс js для переупорядочения и вложения «страниц».

Язык шаблонов и аутентификация / авторизация оставлены на усмотрение разработчика. https://github.com/maca/tiny_cms

0 голосов
/ 23 апреля 2009

Посмотрите на источники RadiantCMS, они реализуют эту функциональность, насколько я понимаю их описание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...