开发者

Nested routing in Ruby on Rails

开发者 https://www.devze.com 2022-12-25 02:40 出处:网络
My model class is: class Category < ActiveRecord::Base acts_as_nested_set has_many :children, :foreign_key => \"parent_id\", :class_name => \'Category\'

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?

0

精彩评论

暂无评论...
验证码 换一张
取 消