Hello,
I am implementing a classic invoice application. On the create new
invoice page
I want to allow users to add new line items using AJAX:
Invoice Date [ ]
Client [ ]
Line Items
- [ ] $[ ]
When the user clicks on the link I would like to add
a new
empty line item below the first using AJAX, without saving anything to
the
database. A line item consists of a description and a price.
I want the line items, on save, to be passed to the controller as an
array,
e.g., [{‘description’ => ‘line a’, ‘cost’ => ‘100’}, {‘description’ =>
‘line
b’, ‘cost’ => ‘200’}]. I can’t find the correct naming convention for
the
textboxes to produce this data structure in the controller.
I have tried:
<%= text_field_tag(“line_items[0][description]”) %>
<%= text_field_tag(“line_items[0][cost]”) %>
<%= text_field_tag(“line_items[1][description]”) %>
<%= text_field_tag(“line_items[1][cost]”) %>
which results in a hash of hashes:
“invoice_default”=>{“0”=>{“cost”=>“100”, “description”=>“line a”},
“1”=>{“cost”=>“200”, “description”=>“line b”}}
The problem with the hash of hashes is that I need to give each new line
item
a key. Because the line items don’t yet exist in the database I have to
give
them an artificial key, a sequential number. It is then tricky to find
the last
number in the sequence in order to add a new empty line item via AJAX.
I have also tried:
<%= text_field_tag(“line_items[][description]”) %>
<%= text_field_tag(“line_items[][cost]”) %>
<%= text_field_tag(“line_items[][description]”) %>
<%= text_field_tag(“line_items[][cost]”) %>
This results in a hash of hashes with a zero length string as the key,
e.g,
{""=>{“cost”=>“100”, “description”=>“line a”}} and only the first line
item
is passed to the controller.
Does anyone have any ideas on how to solve this the rails way, i.e.,
elegantly?
I’m sure I am missing something terribly obvious.
Any help would be appreciated. I’ll write up a wiki entry on this
problem if
anyone has a solution.
I apologise if this has already been discussed on the list. Both the
gmane and
forum bridge searches are down.
Thanks,
Mark