Обновление объекта с помощью ассоциативных принадлежностей и вложенных атрибутов - PullRequest
0 голосов
/ 04 октября 2011

У меня проблемы с выполнением действия обновления для одного из моих объектов данных.У меня есть:

class UserProfile < ActiveRecord::Base
  belongs_to :address, :dependent => :destroy
  belongs_to :post_address, :class_name => 'Address', :dependent => :destroy

  accepts_nested_attributes_for :address
  accepts_nested_attributes_for :post_address
  # validations and stuff
end

class Address < ActiveRecord::Base
  # validations and stuff
end

И проблема с формой и действием:

= form_for @up, :url => '/profile/edit', :method => :post do |f|
  = f.error_messages 
  #...

    = f.fields_for :address,  @up.address do |a|
      #...

    = f.fields_for :post_address, @up.post_address do |a|
      #...

  .field.push
    = f.submit 'Save', :class=>'ok'

Действие:

def edit_account
    @user = current_user

    if request.post?

      @up = @user.user_profile.update_attributes(params[:user_profile])

      if @up.save
        redirect_to '/profile/data', :notice => 'Zmiana danych przebiegła pomyślnie.'
      end   
    else
      @up = @user.user_profile
    end
end

Я получаю ошибку выглядитthis:

Couldn't find Address with ID=3 for UserProfile with ID=2

И это происходит в строке:

@up = @user.user_profile.update_attributes(params[:user_profile])

Я думаю, что AR пытается создать еще один Address, когда форма отправлена, но я не уверен.

Почему я получаю эту ошибку?Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 05 октября 2011

решаемые

Я только что изменил тип ассоциации в UserProfile:

  has_one :address, 
          :class_name   => 'Address', 
          :foreign_key  => 'user_profile_id',
          :conditions   => {:is_post => false},
          :dependent    => :destroy

  has_one :post_address, 
          :class_name   => 'Address', 
          :foreign_key  => 'user_profile_id', 
          :conditions   => {:is_post => true},
          :dependent    => :destroy,
          :validate     => false

И слегка отрегулировал контроллер. Спасибо за помощь!

0 голосов
/ 05 октября 2011

Так что не уверен, как это работает на новом, поскольку @ up.address равен nil. Можете ли вы попробовать что-то вроде:

=f.fields_for :address,  (@up.address.nil? ? Address.new() : @up.address) do |a|
  #...
= f.fields_for :post_address, (@up.post_address.nil? Address.new() : @up.post_address) do |a|
  #...

Что может иметь значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...