使用belongs_to关联和nested_attributes更新对象

时间:2011-10-04 12:16:03

标签: ruby-on-rails ruby-on-rails-3 activerecord

我在为我的某个数据对象进行更新操作时遇到问题。我有:

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

我得到的错误如下:

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 :(得分:0)

所以不确定它是如何工作的,因为@ up.address是零。你可以试试像:

=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|
  #...

那可能有所作为?

答案 1 :(得分:0)

<强>解决

我刚刚更改了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

稍微调整了控制器。谢谢你的帮助!