Mike
Mike

Reputation: 11575

Cannot get simple_nested_form to submit data

I am trying to build a simple_nested_form in my Ruby on Rails app. When I submit my form I am getting some unknown error because it is just redirecting back to the form to input again. Here is the output in the rails server console for when I submit the form. It looks like there is some random "0" => thrown in there.

Parameters: {"machine"=>{"name"=>"2134", "ip_adress"=>"2", "machine_employees_attributes"=>{"0"=>{"machine_id"=>"1", "employee_id"=>"2"}}}, "commit"=>"Create Machine"}

I have a machine model which has_many :machine_employees

and a machineemployee model which belongs_to :machine

Do you have any idea why this 0 => could be appearing because I think it is what is giving me the issues.

Here is the code for my models.

Machine

class Machine < ActiveRecord::Base

# Relationships
has_many :machine_employees
has_many :employees, :through => :machine_employees

accepts_nested_attributes_for :machine_employees, :reject_if => lambda{ |me| me[:employee_id].blank? }

attr_accessible :ip_adress, :name, :machine_employees_attributes


# Validations
validates_presence_of :name, :ip_adress
end

MachineEmployee

class MachineEmployee < ActiveRecord::Base
before_validation :set_default

# Relationships
belongs_to :machine
belongs_to :employee

attr_accessible :employee_id, :machine_id, :end_date, :start_date

# Validations
validates_presence_of :employee_id, :machine_id, :start_date

private

# Callback Methods
def set_default
  self.start_date = Date.today
  self.end_date = nil
end

end

New Machine Form

<div class="row-fluid">

<div class="span3">

    <h1>Add a Machine</h1>

    <br />

    <%= simple_nested_form_for @machine do |f| %>
        <%= render "machine_fields", :f => f %>
        <%= f.button :submit %>
        <%= link_to 'Back', machines_path %>
</div>

<div class="span4">
    <h4>Assign an Employee to This Machine</h4>
    <%= f.simple_fields_for :machine_employees do |me_form| %>
        <!-- render nested machine_employee fields-->
        <%= render "machine_employee_fields", :f => me_form %>
    <% end %>
</div>
<% end %>

</div>

Machine Employee Fields Partial

<%= f.input :machine_id, :as => :hidden, :input_html => { :value => @machine.id } %>
<%= f.input :employee_id, collection: @employees, :id => :name, :prompt => "Select ..." %>

Upvotes: 0

Views: 135

Answers (1)

Max
Max

Reputation: 15975

The 0 is thrown in there because the machine model has_many machine_employees. When you use nested forms, it passes a pseudo-array for has_many relations. So, if you tried to submit 2 machine employees, your hash would look like this:

Parameters: {"machine"=>{"name"=>"2134", "ip_adress"=>"2", "machine_employees_attributes"=>{
                           "0"=>{"machine_id"=>"1", "employee_id"=>"2"},
                           "1"=>{"machine_id"=>"1", "employee_id"=>"3"}
                        }
            }, "commit"=>"Create Machine"}

This way you can access the machine_employees passed from the form by doing params[:machine][:machine_employees_attributes][0] or params[:machine][:machine_employees_attributes][1]. Note that if this was a has_one relationship, then the machine_employees_attributes key would be changed to machine_employee_attributes and there would be no numerical index.

I suspect the problem is that your machine model must accept_nested_attributes_for :machine_employees and must also have attr_accessible :machine_employees_attributes.

Upvotes: 1

Related Questions