Вложенная маршрутизация в 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?