2013-09-24 113 views
19

我的嵌套模式形式我試圖創建的HAS_ONE關聯嵌套的模型形式。 (我使用Rails 4)不能更新HAS_ONE協會

在我的用戶,和地址,模型我有以下:

class User < ActiveRecord::Base 
has_one :address 
accepts_nested_attributes_for :address 
end 

class Address < ActiveRecord::Base 
belongs_to :user 

end 

我的用戶控制器:

class UsersController < ApplicationController 
    . 
    . 
    . 
    def edit 
     @user = User.find(params[:id]) 
     @user.build_address if @user.address.nil? 
    end 

    def update 
     @user = User.find(params[:id]) 
     if @user.update(params.require(:user).permit(:user_name, address_attributes: [:street])) 
     flash[:success] = "Profile updated successfully" 
     sign_in @user 
     redirect_to @user 
     else 
     flash.now[:error] = "Cannot updating your profile" 
     render 'edit' 
     end 
    end 
end 

最後我認爲我有:

= form_for(@user) do |f| 
    = render 'shared/error_messages', object: f.object 
    %div 
    = f.label :user_name, "User name" 
    = f.text_field :user_name 
    = f.fields_for :address do |add| 
     = addd.label :street 
     = d.text_field :street 
    = f.submit "Update" 

當我嘗試填寫街道提交的第一次它的作品,但是當我嘗試更新Ë我得到的錯誤:Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

任何想法,是錯誤?感謝的

回答

20

在你的控制器UsersController,在update方法中,添加address: :id到地址允許的屬性。就像這樣:

params.require(:user).permit(:user_name, address_attributes: [:id, :street])) 
+1

WOOW它的工作原理謝謝你,這是我搜索:d但你可以詳細解釋了什麼是我在這裏的錯誤的原因 – medBo

+0

你能解釋我爲什麼更多的我要補充ID我address_attributes請 – medBo

+0

@medBo我不知道爲什麼你必須包括將:id添加到您必須更新的嵌套屬性中。它沒有特別記錄,幾個月前我也遇到過完全相同的問題,在尋找解決方案之前,在一週的時間裏苦苦掙扎。也許更高級/專業的Rails開發人員可以提供幫助。高興是有幫助的;-) – d34n5

0

這個錯誤通常表明沒有爲has_one關係的現有記錄。換句話說,這個特殊的user對象已有與之關聯的address記錄。在瀏覽器中測試表單時可能會發生這種情況。

在這種情況下,看起來Rails正在嘗試創建一個新的地址記錄,並且它與您的edit動作的寫入方式有關。

試試這個:

def edit 
    @user = User.find(params[:id]) 
    @address = user.address || @user.build_address 
end 
+0

但我儘量不更新信息,以創建新紀錄! – medBo

+0

它似乎像你說的,如果用戶已經一個地址,他不能更新... – medBo

+0

我嘗試更新的代碼。 – Mohamad

28

還有就是要讓它做部分更新,如果記錄已經存在一個選項:

accepts_nested_attributes_for(:address, update_only: true) 

這裏記載:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

+0

好趕上我會稍後嘗試它,然後它需要添加嵌套屬性的id,現在文檔更清楚這一點謝謝@micaeked – medBo

+1

男人,我試過與設計和嵌套形式有關的所有答案,只有一個清楚,簡單的答案和最好的,它工作!非常感謝你,我努力嘗試(14小時),直到做出來! – pmargreff