How to set different id in nested form attributes

107 views
Skip to first unread message

Angelo Cordova

unread,
Jan 4, 2012, 11:47:18 AM1/4/12
to Ruby on Rails: Talk
Hi people.

I'm developing a rails 3.0.9 app, I'm using "accept nested attributes
for" to add dynamically new "child" items to its parent. the thing is
every child has the same id, and I need every child with its own id,
because I need to make some jquery functions to work with them.

Is there a way to achieve this?

Tanks for your help

Tim Shaffer

unread,
Jan 4, 2012, 11:57:34 AM1/4/12
to rubyonra...@googlegroups.com
How did all the children end up with the same ID?

Posting some of your problematic code can help us help you.

Colin Law

unread,
Jan 4, 2012, 11:58:33 AM1/4/12
to rubyonra...@googlegroups.com
On 4 January 2012 16:47, Angelo Cordova <acor...@gmail.com> wrote:
> Hi people.
>
> I'm developing a rails 3.0.9 app, I'm using "accept nested attributes
> for" to add dynamically new "child" items to its parent. the thing is
> every child has the same id, and I need every child with its own id,
> because I need to make some jquery functions to work with them.

I presume you are talking about the id in the html rather than the id
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

Angelo Cordova

unread,
Jan 4, 2012, 2:38:59 PM1/4/12
to Ruby on Rails: Talk


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 %>&nbsp;
<%= 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

Angelo Cordova

unread,
Jan 4, 2012, 4:14:05 PM1/4/12
to Ruby on Rails: Talk
I already solve this

I'm really sorry, I've just realized that every child had its own
"id", so it was easier to get it solved.

Thanks for your help and for sharing your time




Reply all
Reply to author
Forward
0 new messages