On 4 ene, 13:58, Colin L. [email protected] wrote:
of the record in the database. When you generate the html for the
child, just allocate a new id for each. Since you have not shown us
how you generate the html it is difficult to comment.
Colin
Yes, I’m not saying that the DB id is the same, I’m saying the html
attribute “id” is the same, sorry for that.
But I don’t know how to set a different id for each child.
I’m using nested attributes in this way, to simplify I will use
“document” and “products”, where a “document” has many “products”:
app/models/document
class Document < ActiveRecord::Base
has_many :details,:class_name => ‘Product’, :foreign_key =>
‘document_id’, :dependent => :destroy
accepts_nested_attributes_for :details, :allow_destroy => :true
end
app/models/product
class Product < ActiveRecord::Base
belongs_to :document :foreign_key => ‘document_id’
end
app/controllers/documents
class DocumentsController < ApplicationController
def index…
def show…
def new
@document = Document.new
@document.products.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @document }
end
end
def…
…
…
end
app/views/documents/_form
<%= form_for @document do |f| %>
(document fields such as number, provider, date, etc)
Products
<% if @document.id %>
<%= f.fields_for :details do |d| %>
<%= render "details", :f => d %>
<% end %>
<% end %>
<%= link_to_add_fields "+ Add Product", f, :details %>
...
...
(button for "submit")
<% end %>
app/views/documents/_details
<%= f.label :product %>
<%= f.collection_select(:document_id, Document.all, :id, :number,
options = {:prompt => ‘’},:class => ‘_prod select sbig’) %>
<%= link_to_remove_fields "remove product", f %>
app/helpers/applicationhelper
module ApplicationHelper
def link_to_remove_fields(name, f)
f.hidden_field(:_destroy) + link_to_function(name,
“remove_fields(this)”)
end
def link_to_add_fields(name, f, association)
new_object =
f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index =>
“new_#{association}”) do |builder|
render(association.to_s.singularize, :f => builder)
end
link_to_function(name, (“add_fields(this, ‘#{association}’,
‘#{escape_javascript(fields)}’)”))
end
end
public/javascripts/application.js
function remove_fields(link) {
$(link).prev(“input[type=hidden]”).val(“1”);
$(link).closest(“.fields”).hide();
}
function add_fields(link, association, content) {
var new_id = new Date().getTime();
var regexp = new RegExp(“new_” + association, “g”)
$(link).parent().before(content.replace(regexp, new_id));
}
So, in _details, I didn’t set an id (html attribute) for product but
If I check with firebug, The id is the same for each “detail”, if I
try to set manually, obviously, each “detail” get the same id.
Please, help me