routing and has_many

Hi,
im a rails newbie, so please be gentle:

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

when i use the url

/categories/7/products

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?

Thanks,

HansFH

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
work:

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

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.

Colin

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
     else
       flash[:error] = "No category with id=#{params[:category_id]}"
       redirect_to categories_path
     end
   end
   def find_category
     @category = Category.find_by_id(params[:category_id])
   end

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

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com