has_and_belongs_to_many relationship in nested forms

Hi,

I have two models (say model a and b) that are joined using the has_and_belongs_to_many association. In model A I want to be able to link to model B in a form. But, when I create a nested_form for model B I have a problem. Instead of linking to the exciting records in Model B. It creates new ones. Is there anyway to use nested_forms so that model B objects are linked to, but not created on submission? When I create a new model A I just want to link to, not create new model Bs. Is this possible?

Thanks,

Josh

Yes, and it's likely someone could help debug the issue if you post the code.

Here is the code. I am sorry because this is work I cannot post the entire application. Thanks for all help and I hope this makes my problem clearer.

Thanks,

Josh

class StressTest < ActiveRecord::Base has_and_belongs_to_many :tst_definitions accepts_nested_attributes_for :tst_definitions has_many :tst_datas end

class StressTestsController < ApplicationController layout ‘tests.html’ def index @stress_tests = StressTest.all end

def new @stress_test = StressTest.new

#want to add not create new tst_definitions
@stress_test.tst_definitions<< TstDefinition.first

end

def create @stress_test = StressTest.new(params[:stress_test]) logger.info params.to_yaml if @stress_test.save flash[:notice] = “Successfully create Stress Test: #{@stress_test.name}” redirect_to :action => ‘index’ else render :action => ‘new’ end end

def destroy @stress_test = StressTest.find(params[:id]) @stress_test.destroy redirect_to :action => ‘index’ end end

The new form New Stress Test

<% form_for(@stress_test) do |f| %>

<%= f.label :name %> <%= f.text_field :name %>
<%= f.label :max_concurrent_scans %> <%= f.text_field :max_concurrent_scans %>
<%= f.label :number_of_runs %> <%= f.text_field :number_of_runs %>

<% f.fields_for :tst_definitions do |test_form| %>

  • <%= test_form.select :name, TstDefinition.find_by_sql(“select id, name from tst_definitions”).collect {|test| [test.name, test.id]} %> <%= link_to ‘Remove’, ‘#remove_project’, :class => ‘remove_codesecure_project’ %>
<%= link_to ‘Add a project’, ‘#add_project’, :class => ‘add_codesecure_project’ %> <% end -%>


<%= f.submit 'submit' %>

<% end -%>

Javascript that addess a new drop down so that multiple tst_definitions can be added to a single stress_test $(document).ready(function() { $(“a[class="add_codesecure_project"]”).click(function(event){ var copy_object = $(“ul”).children().eq(0).clone() copy_object.appendTo(“ul”); var num_of_children = $(“ul”).children().size(); copy_object.children(“select”).attr(“id”, copy_object.children(“select”).attr(“id”).replace(/0/, (num_of_children - 1))); copy_object.children(“select”).attr(“name”, copy_object.children(“select”).attr(“name”).replace(/0/, (num_of_children - 1))); //alert(copy_object.children(“select”).attr(“id”).replace(/0/, (num_of_children - 1)));

//alert(copy_object.children("select").attr("id"))
//alert(copy_object.attr("id")); 

add_remove_link();

});

});

Hi, After I looked into it some more I figured it out. I had a little bit of a concept mix up with accepts_nested_attributes_for. Because I do not want to create nested record. I do not think it is appropriate for this situation. So I do not use it anymore. Thanks for the help sorry to cause people trouble.

Josh

So how would you do something like this? I'm not sure whether I would be better off going with accepts_nested_attributes_for acts_as_taggable. My example is a habtm relationship between books and authors. In a "new book" form, I would love to be able to connect authors already existing in the database, but then being able to add a new author if they don't already exist. Thanks!