views:

192

answers:

3

My model class is:

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

Is it possible to have such recursive route like this: /root_category_slug/child_category_slug/child_of_a_child_category_slug ... and so one

Thank you for any help :)

A: 

It's not easy (read: I don't know how to do it) and it's not advised. Imagine if you have 10 categories, you do not want the url to be /categorya/categoryb/categoryc/categoryd/categorye/categoryf/categoryg/categoryh/categoryi/categoryj.

Perhaps a maximum level of 3 would grant you the power you desire, without polluting the URL?

Ryan Bigg
For my opinion level the level should be limited by the model, not by the routing rule.
vooD
@Ryan Bigg, how would you prefer to write a URL for something like this, assuming you do have n-depth? he's trying to show a category in a certain location in the tree (and it could have others).
Yar
+2  A: 

I doubt it, and it's not a good idea. Rails Route mapping code is complex enough without having to dynamically try to encode & decode (possibly) infinite route strings.

simianarmy
+2  A: 

You can do that with regular routes and Route Globbing, so for example,

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

Then in your controller

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

However, note that nested resource routing more than one level deep isn't recommended.

Corey
I had the same question, and this works perfectly. I would argue Jamis' rule doesn't apply in this case, since the resource itself is represented as a hierarchical structure. (And there's no need to use nested resources/routes in this case anyway).
Kyle Fox