2013-09-24 8 views
19

के लिए मेरे नेस्टेड मॉडल फॉर्म को अपडेट नहीं किया जा सकता है I have has_one एसोसिएशन के लिए नेस्टेड मॉडल फॉर्म बनाने का प्रयास करता हूं।has_one एसोसिएशन

मेरे उपयोगकर्ता (i रेल 4 का उपयोग कर रहा है), और पता मॉडल मेरे पास है निम्नलिखित:

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

, update विधि में, address: :id जोड़ने पते की अनुमति विशेषताओं के:

इस प्रयास करें। इस तरह:

accepts_nested_attributes_for(:address, update_only: true) 

यहाँ प्रलेखित:

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

वाह यह काम करता है धन्यवाद आप, मैं यही खोजता हूं: डी लेकिन क्या आप मेरी त्रुटि का कारण यहां बता सकते हैं – medBo

+0

क्या आप मुझे और बता सकते हैं कि मुझे अपने एड्रेस_ट्रिब्यूट्स में आईडी क्यों जोड़नी चाहिए कृपया – medBo

+0

@medBo मुझे नहीं पता कि आपको क्यों शामिल करना है : नेस्टेड विशेषताओं को आईडी को अपडेट करना होगा। यह विशेष रूप से प्रलेखित नहीं है और कुछ महीने पहले मेरे पास एक ही समस्या थी, समाधान खोजने से पहले एक सप्ताह के अंत में संघर्ष कर रहा था। शायद एक और वरिष्ठ/विशेषज्ञ रेल डेवलपर मदद कर सकते हैं। सहायक होने के लिए खुश ;-) – d34n5

0

यह त्रुटि आमतौर पर इंगित करती है कि has_one संबंध के लिए एक मौजूदा रिकॉर्ड है। दूसरे शब्दों में, यह विशेष user ऑब्जेक्ट में पहले से ही address रिकॉर्ड है। ब्राउजर में फॉर्म का परीक्षण करते समय यह हो सकता है।

इस मामले में, ऐसा लगता है कि रेल एक नया पता रिकॉर्ड बनाने की कोशिश कर रहा है, और इसे यह करना है कि आपकी edit कार्रवाई कैसे लिखी गई है। अपने नियंत्रक UsersController में

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

लेकिन मैं बनाने के लिए जानकारी का अद्यतन करने के लिए नहीं की कोशिश एक नया रिकॉर्ड !! – medBo

+0

ऐसा लगता है कि आप कहते हैं कि यदि उपयोगकर्ता पहले से ही एक पता है, तो वह इसे अपडेट नहीं कर सकता ... – medBo

+0

मेरे अपडेट किए गए कोड को आजमाएं। – Mohamad

28

यह एक आंशिक अद्यतन करते हैं रिकॉर्ड पहले से मौजूद है बनाने के लिए एक विकल्प नहीं है http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

+0

अच्छी पकड़ मैं इसे बाद में कोशिश करूँगा, इससे पहले कि इसे नेस्टेड विशेषताओं की आईडी जोड़ने की आवश्यकता हो, अब दस्तावेज़ इस बिंदु के बारे में अधिक स्पष्ट है @ micaeked – medBo

+1

आदमी, मैंने devise और नेस्टेड रूपों से संबंधित सभी उत्तरों के साथ प्रयास किया, एक स्पष्ट, सरल उत्तर और सर्वोत्तम के साथ एकमात्र व्यक्ति फिर से, यह काम किया !!! बहुत बहुत धन्यवाद, मैंने इसे बनाने तक कठोर प्रयास किया (14 घंटे)! – pmargreff

संबंधित मुद्दे