fatfrog
fatfrog

Reputation: 2160

Rails - creating multiple records, not all params are being passed

I'm trying to add multiple product skus to an order at once.

Product has_many skus, Order has_many order_lines

So in my order, I pull up a product and see all its skus (brown-small, brown-large) I then enter the qty of each I want to put on the order.

For some reason, it is only passing the :qty_sold params, and not the :sku_id - any reason why?

Routes:

post   '/order_lines/create' => 'order_lines#create', :as => :create_order_lines

Form:

<%= form_tag create_order_lines_path do %>

        <%= hidden_field_tag :order_id, @order.id %>

        <% @product.first.skus.each_with_index do |sku, index| %>
            <%= text_field_tag "order_lines[#{index}]", :sku_id, {:value => sku.id }  %>
            <%= sku.colour %>
            <%= text_field_tag "order_lines[#{index}]", :qty_sold, {:value => ''}  %>
        <% end %>

        <%= submit_tag "Add" %>

<% end %>

Output:

Started POST "/order_lines/create" for 127.0.0.1 at Fri Mar 16 23:13:27 -0400 2012
  Processing by OrderLinesController#create as HTML
  Parameters: {"commit"=>"Add", "order_id"=>"1", "authenticity_token"=>"JmImxbFUGLdM6Vt0rrS9RabSCUi1kV2QRTpWp34BBb4=", "utf8"=>"\342\234\223", "order_lines"=>{"0"=>"7", "1"=>"8", "2"=>"", "3"=>"9", "4"=>"", "5"=>""}}

Upvotes: 0

Views: 278

Answers (1)

Azolo
Azolo

Reputation: 4383

This line is setting the key that you're having problems with

text_field_tag "order_lines[#{index}]"

So basically you're saying order_lines[X] = and since :qty_sold is the last option set to that key it's getting assigned that value.

To accomplish what you're trying to accomplish you would need to go a level deeper, like this

<%= text_field_tag "order_lines[#{index}][qty_sold]", :qty_sold, {:value => ''}  %>

Honestly though, you should consider looking into the fields_for helper it does everything you want to accomplish and is more abstract.

This is untested but I think it should work

<% @product.skus.each do |sku| %>
  <%= fields_for :order_lines do |order_line_fields| %>
    <%= order_line_fields.text_field :sku_id, {:value => sku.id} %>
    <%= sku.colour %>
    <%= order_line_fields.text_field :qty_sold %>
  <% end %>
<% end %>

Upvotes: 1

Related Questions