ActiveRecord :: AssociationTypeMismatch при попытке сохранить вложенные атрибуты в Rails - PullRequest
4 голосов
/ 16 февраля 2011

Я прочитал много страниц об отношениях has_one и вложенных атрибутах, но мне не удалось выполнить эту работу.Любая помощь была бы фантастической.

Каждый пользователь имеет сеть.Я пытаюсь собрать информацию для обоих атрибутов в одной форме, но продолжаю получать исключение ActiveRecord::AssociationTypeMismatch in UsersController#create

Передаваемые параметры:

{"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"}

Я предполагаю параметры для Network должен как-то отображаться как network_attributes, но я не уверен, как.

Контроллер:

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

Вид:

<%= 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 %>

и, конечноМодели:

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation, :network_attributes, :network
  has_one  :network, :foreign_key => "user_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

Спасибо

Ответы [ 3 ]

8 голосов
/ 18 февраля 2011

Если у кого-то еще возникла такая же проблема, я решил эту проблему, изменив:

<%= f.fields_for @network do |fn| %> на <%= f.fields_for :network do |fn| %> и удалив :network как доступный атрибут из пользовательской модели.

1 голос
/ 16 февраля 2011

Не уверен, думаю, вам нужно:

<%= f.fields_for @network, :network_attributes do |fn| %>
0 голосов
/ 10 апреля 2011

Если вы удалите: сеть из модели как доступную, она не будет работать наверняка

...