Getting fields_for and accepts_nested_attributes_for to work with a belongs_to relationship
I'm a few months too late, but I was looking to solve this error and my situation was that I could not change the relationship to 'face the other way'.
The answer really is quite simple, you have to do this in your new action:
@account.build_owner
The reason why the form did not display using fields_for was because it did not have a valid object. You had the right idea up there with:
@account.owner.build
However, this is not the way belongs_to
work. This method is only generated with has_many
and has_and_belongs_to_many
.
Reference:http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference
I'm using Rails 2.3.5 and I noticed the same thing. Checking out the source for active_record's nested_attributes.rb, it looks like belongs_to should work fine. So it appears it might be a "nested forms" bug.
I have a nested form exactly like yours, with User belongs_to :address
, and Address
is independent of the user.
Then in the form, I just do <% f.fields_for :address_attributes do |address_form| %>
instead of <% f.fields_for :address do |address_form| %>
. Temporary hack until there's a better way, but this works. The method accepts_nested_attributes_for
is expecting the params to include something like:
{user=>{address_attributes=>{attr1=>'one',attr2=>'two'}, name=>'myname'}
...but fields_for
is producing:
{user=>{address=>{attr1=>'one',attr2=>'two'}, name=>'myname'}
This way you don't have to add that has_one :account
to your code, which doesn't work in my case.
Update: Found a better answer:
Here is the gist of the code I'm using to make this work right:
Rails Nested Forms with belongs_to Gist
Hope that helps.
I think your accepts_nested_attributes
is on the wrong side of the relationship. Maybe something like this would work?
class Account < ActiveRecord::Base belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id' has_many :usersendclass User < ActiveRecord::Base belongs_to :account has_one :account, :foreign_key => :owner_id accepts_nested_attributes_for :accountend
For building the account you want to use build_account.
You can see more examples in the docs.