has_and_belongs_to_many - help?

Have you looked this tutorial http://www.buildingwebapps.com/podcasts/6789-resources-page-links-categories-and-habtm/show_notes (download the second link source code.)

Again, I’m new, so take this for what its worth…

Notice in their create method for pages and links (the two that have the habtm relationship) there is no need to add the collection to the main object. It looks like you shouldn’t need:


You should just be able to use

@recipe = Recipe.new

And it should pull in the selected categories from your select options.

Not sure if it matters but in the example posted they are using a different select tag than you’re using:

<%= f.collection_select :category_ids, Category.find(:all, :order => ‘title’), :id, :title, {}, :multiple => true %>

Actually looking at your select tag I’m not sure how something like “recipe_ids” would be set the way you have it:

<%= select_tag ‘category_recipe_ids[]’, options_from_collection_for_select(@categories, :id, :title), {
:multiple => true, :size =>5, :id => “categories_recipes_id” }

Why not try something like have shown:

<%= f.collection_select :category_ids, Recipe.find(:all), :id, :title, {}, :multiple => true %>

Also if you were going to be setting the categories in recipes (which I don’t think you need to do anyway), wouldn’t it be something like

@recipe.category_ids <<(params[:category_ids])

I don’t think you’d set the category_recipe_id ? (Again, I’m new so I could be way off here.)

Riiiick, you are a star. Atlast we have a working example for HABTM. I
have given here the complete code if anyone needs it.

Problem: A recipe can have many categories and a Category can have many

Model: Recipe

class Recipe < ActiveRecord::Base
  has_and_belongs_to_many :categories

Model: Category

class Category < ActiveRecord::Base
  has_and_belongs_to_many :recipes

Controller: recipes_controller

class RecipesController < ApplicationController
  def new
    @recipe = Recipe.new
    @categories = Category.find(:all)

  def create
    @recipe = Recipe.new(params[:recipe])
    redirect_to :action=>'show', :id=>@recipe.id

  def show

View: New.html.erb

<% form_for :recipe, @recipe, :url => { :action => "create" } do |f| %>
  <%= f.text_field :title, :maxlength => 100 %>
  <%= f.collection_select :category_ids, @categories, :id, :title, {},
:multiple => true %>
  <%= submit_tag 'save',
:style=>'font-size:14px;font-weight:bold;width:100px' %><br>
<% end %>

View: Show.html.erb

<%= @recipe.title %>
<% @recipe.categories.each do |c|%>
   <%= c.title %>
<% end %>