Вложенная маршрутизация в Ruby on Rails

Мой модельный класс:

class Category < ActiveRecord::Base
  acts_as_nested_set
  has_many :children, :foreign_key => "parent_id", :class_name => 'Category'
  belongs_to :parent, :foreign_key => "parent_id", :class_name => 'Category' 


  def to_param
    slug
  end
end

Возможно ли иметь такой рекурсивный маршрут как этот:/root_category_slug/child_category_slug/child_of_a_child_category_slug... и так один

Спасибо за любую помощь:)

4 ответа

Решение

Вы можете сделать это с обычными маршрутами и маршрутизацией Globbing, например,

map.connect 'categories/*slugs', :controller => 'categories', :action => 'show_deeply_nested_category'

Тогда в вашем контроллере

def show_deeply_nested_category
  do_something = params[:slugs]  # contains an array of the path segments
end

Однако обратите внимание, что маршрутизация вложенных ресурсов на глубину более одного уровня не рекомендуется.

Я сомневаюсь в этом, и это не очень хорошая идея. Код отображения маршрутов Rails достаточно сложен без необходимости динамически пытаться кодировать и декодировать (возможно) бесконечные строки маршрута.

Вы можете использовать ограничения в маршрутизации рельсов. например:

match '*id', :to => 'categories#show', :constraints => TaxonConstraint.new

class TaxonConstraint
  def matches?(request)
    path = request.path.slice(1..(request.path.length-1)
    path = path.split('/')
    return false if path.length != path.uniq.length
    return true if Category.check(path.last).first
    false
  end
end

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

Это не легко (читай: я не знаю, как это сделать), и это не рекомендуется. Представьте, если у вас есть 10 категорий, вы не хотите, чтобы URL был /categorya/categoryb/categoryc/categoryd/categorye/categoryf/categoryg/categoryh/categoryi/categoryj,

Возможно, максимальный уровень 3 даст вам желаемую мощность без загрязнения URL?

Другие вопросы по тегам