Nested routing in Ruby on Rails
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, :foreig开发者_开发问答n_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 :)
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.
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.
You can use constraints in rails routing. eg:
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
class splits your path by "/" , and checks db for last element in db. if not found, skips the route. if any one knows, how to solve it better, would be glad to hear.
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?
精彩评论