On 4 ene, 13:58, Colin Law <
clan...@googlemail.com> wrote:
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)
<h3>Products</h3>
<div class="details">
<% if @
document.id %>
<%= f.fields_for :details do |d| %>
<%= render "details", :f => d %>
<% end %>
<% end %>
<%= link_to_add_fields "+ Add Product", f, :details %>
</div>
...
...
(button for "submit")
<% end %>
app/views/documents/_details
<div class="fields">
<%= 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 %>
</div>
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