ActiveRecord::AssociationTypeMismatch when attempting to save nested attributes in Rails
I read through a lot of pages on `has_one relationships and nested attributes but haven't been successful in making this work. Any help would be fantastic.
Each User has_one Network. I'm trying to gather information for both attributes in one form but keep getting the exception ActiveRecord::AssociationTypeMismatch in UsersController#create
The parameters passed are:
{"utf8"=>"✓",
"authenticity_token"=>"I54tm1ovzHEHaXbBLTT+5tqBJv2795sKg978ot3HDBc=",
"user"=>{"name"=>"Bilbo Baggins",
"email"=>"bilbo@lotr.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"network"=>{"home_lng"=>"-87.91894912719727",
"home_lat"=>"43.03812464542969",
"center_lng"=>"-87.91894912719727",
"center_lat"=>"43.03812464542969",
"radius"=>"500"}},
"commit"=>"Sign up"}
I'm guessing the parameters for Network
have to somehow show up as network_attributes
but I'm not sure how.
Controller:
def create
@user = User.new(params[:user])
if (@user.save)
sign_in @user
flash[:success] = "One ring to rule them all!"
redirect_to @user
else
@title = "The journey begins..."
render 'new'
end
end
View:
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :email %>
<%= f.text_field :email %><br />
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>
<%= f.fields_for @network do |fn| %>
<%= fn.hidden_field :home_lng %>
<%= fn.hidden_field :home_lat %>
<%= fn.hidden_field :center_lng %>
<%= fn.hidden_field :center_lat %>
<%= fn.hidden_field :radius %>
<% end %>
and of course, the Models:
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email, :password, :password_confirmation, :network_attributes, :network
has_one :network, :foreign_key => "u开发者_StackOverflow社区ser_id",
:dependent => :destroy
accepts_nested_attributes_for :network,
:reject_if => :all_blank,
:allow_destroy => true
end
class Network < ActiveRecord::Base
attr_accessible :home_lng, :home_lat, :center_lng, :center_lat, :radius
belongs_to :user
end
Thank you
Incase someone else is having the same issue, I resolved this by changing:
<%= f.fields_for @network do |fn| %>
to <%= f.fields_for :network do |fn| %>
and removing :network
as an accessible attribute from the user model.
Not certain, think you need:
<%= f.fields_for @network, :network_attributes do |fn| %>
If you remove :network from the model as an accessible it will not work for sure
精彩评论