Вложенная маршрутизация в Ruby on Rails - PullRequest
7 голосов
/ 01 апреля 2010

Мой класс модели:

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 ]

4 голосов
/ 04 апреля 2010

Вы можете сделать это с обычными маршрутами и Route 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

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

2 голосов
/ 04 апреля 2010

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

1 голос
/ 29 июля 2011

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

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если не найден, пропускает маршрут.если кто-нибудь знает, как решить это лучше, был бы рад услышать.

0 голосов
/ 01 апреля 2010

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

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

...