don't let :name_prefix result in the name of an existing model

Posted by David Tue, 01 May 2007 23:24:18 GMT

Here’s something that bit me today. I’ll bet it’s documented somewhere, and it makes perfect sense, but maybe I can help you avoid this in case you missed the docs like I did.

The situation

I’m working on an asset management system which includes Categories and Tags, which have a many-to-many relationship expressed by a CategorizedTag model.

class Category < ActiveRecord::Base
  has_many :tags, :through => :categorized_tags
  has_many :categorized_tags
end

class Tag < ActiveRecord::Base
  has_many :categories, :through => :categorized_tags
  has_many :categorized_tags
end

class CategorizedTag < ActiveRecord::Base
  belongs_to :category
  belongs_to :tag
end

The problem

In routes.rb, I wanted to nest tags inside categories:

  map.resources :categories do |categories|
    categories.resources :tags, :name_prefix => 'categorized_'
  end

This seemed fine, but I got a nil-pointer error on categorized_tags_path in a view.

The fix

Guessing that there was a naming conflict with CategorizedTag, I tried this instead (‘category_’ instead of ‘categorized_’):

  map.resources :categories do |categories|
    categories.resources :tags, :name_prefix => 'category_'
  end

Sure enough, category_tags_path worked just fine!

The moral

So make sure that when you use :name_prefix that it doesn’t result in the name of an existing model.

Comments

Leave a response

Comments