I’m having trouble with saving to two different models, from one form…
I
tried to follow rails casts #196 and looked at several other examples
here
at stackoverflow but I haven’t figured out how to do this because my
case
is a little bit different…
So, I have two models:
class Patient < ActiveRecord::Base
attr_accessible :date_of_birth, :patient_name
has_many :samples
end
class Sample < ActiveRecord::Base
attr_accessible :approved, :patientID, :result, :patient
belongs_to :patient
accepts_nested_attributes_for :patient
end
What I found on most of the examples I saw, including the railscasts, is
to
create a new sample inside the patient form, and the
“accepts_nestes_attributes_for” is inside the “patient” model… But
what I
want to do is exactly the opposite, that is, creating a new patient
inside
the new sample form.
Here’re my views, I have a normal form for the sample and then a partial
for the patient part:
_form.html.erb
<%= form_for(@sample) do |f| %>
<% if @sample.errors.any? %>
<%= pluralize(@sample.errors.count, “error”) %> prohibited
this sample from being saved:
<ul>
<% @sample.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.text_area :result %>
<%= f.check_box :approved %>
patient.html.erb
<%= fields_for :patient do |p| %>
<%= p.text_field :patient_name %>
<%= p.date_select :date_of_birth %>
When I click the submit button everything seems to work, but nothing is
saved into the patients table.
Here’s the log:
Started POST “/samples” for 127.0.0.1 at 2013-10-12 23:32:03 +0100
Processing by SamplesController#create as HTML
Parameters: {“utf8”=>“✓”,
“authenticity_token”=>“13OKZ8DaGJ4zTb35q+ymSzx7r+Ipxou1u+XrR4jtyeI=”,
“sample”=>{“result”=>“teste 3”, “approved”=>“0”},
“patient”=>{“patient_name”=>“Joao”, “date_of_birth(1i)”=>“2013”,
“date_of_birth(2i)”=>“10”, “date_of_birth(3i)”=>“10”}, “commit”=>“Create
Sample”}
(0.1ms) begin transaction
SQL (0.5ms) INSERT INTO “samples” (“approved”, “created_at”,
“patientID”, “result”, “updated_at”) VALUES (?, ?, ?, ?, ?)
[[“approved”, false], [“created_at”, Sat, 12 Oct 2013 22:32:03 UTC
+00:00], [“patientID”, nil], [“result”, “teste 3”], [“updated_at”, Sat,
12 Oct 2013 22:32:03 UTC +00:00]]
(2.4ms) commit transaction
Redirected to http://localhost:3000/samples/3
Completed 302 Found in 6ms (ActiveRecord: 2.9ms)
As you can see in the log, it’s only saving to the sample table. Can I
use
accepts_nested_attributes_for this way? Is there a way to achieve what I
want? Or should I try a different approach?
After I solve this I will try to check first if the patient exists or
not
before committing and try to do as SAYT on the patient’s name… but
that’s
a future step!
Thanks for your help