routing and has_many

im a rails newbie, so please be gentle:

let's say category habtm products and i've got a product with the id

when i use the url


should the server show me only the categories of product 7?

On my Server it always shows all categories i have.

How do i solve this the right way?

I edited the routes.rb so, that

  map.resources :categories, :has_many => [:products]

But this does not change anythings, using
/categories/7/products always leads to the index action of the
products controller.

Is the right way to test in the index action of the products
controller whether category_id is set in params and use this
information to only show products of this category? Or is there a
better way?



It sounds like your routes are set up alright, but yeah, you'll still
need to add code so your action knows how to handle it.

In your ProductsController#index action, you probably have something
like this?

  @products = Product.all

Since you have category_id in the params, something like this should

  if params[:category_id]
    @category = Category.find(params[:category_id])
    @products = @category.products

Personally, if I have a controller that's always used as a nested
resource, I put the initialization of the parent into a before_filter,
so it's called for every action.

I am not sure if this answers your question or not, and you may know
this already, but if you have found the product with id 7 and it is in
variable @product say, then the categories for that product are
available as an array in @product.categories.

Apologies if this is nothing to do with what you want to achieve.


If you have a line in ProductsController#index like:

   @products = Product.find(:all)

Then of course you'll see all products. The question is what you want to see at that url. I'd expect to see all the products in category 7

   def index
     if find_category
       @products = @category.products
       flash[:error] = "No category with id=#{params[:category_id]}"
       redirect_to categories_path
   def find_category
     @category = Category.find_by_id(params[:category_id])

And you can even put the find_category into a before_filter and redirect from it directly.


Rob Biedenharn