2012-02-20 9 views
20

मैं एक विचित्र मुद्दा जहां बच्चों को कॉलबैक जब जनक अद्यतन किया जाता है निकाल दिया नहीं कर रहे हैं में चल रहा हूँ ... निकाल दिया नहीं कर रहे हैंरेल नेस्ट का श्रेय बच्चों कॉलबैक

मैं निम्नलिखित मॉडल सेटअप:

class Budget < ActiveRecord::Base 
    has_many :line_items 
    accepts_nested_attributes_for :line_items 
end 

 

class LineItem < ActiveRecord::Base 
    belongs_to :budget 

    before_save :update_totals 

    private 
    def update_totals 
    self.some_field = value 
    end 
end 

मेरी रूप में, मैं एकत्रित फ़ील्ड (बनाया fields_for का उपयोग) है:

= form_for @budget do |f| 
    = f.text_field :name 
    = f.fields_for :line_items do |ff| 
    = ff.text_field :amount 

update_totals बच्चे पर कॉलबैक क्यों नहीं निकाला गया/मैं इसे आग लगाने के लिए क्या कर सकता हूं?

+0

क्या आपको कभी इसका समाधान मिला? – Steve

+0

नहीं ... :(मैंने केवल अजीब कॉलबैक का एक गुच्छा लिखना समाप्त कर दिया – sethvargo

+0

मैंने एक छोटा सा नमूना आवेदन बनाया और आपकी समस्या को पुन: उत्पन्न करने में असमर्थ था। क्या आप निश्चित हैं कि कॉलबैक को निकाल दिया नहीं जा रहा है? सुनिश्चित करने का सबसे आसान तरीका विधि के अंदर अपवाद उठाना है। अगर अपवाद उठाया जा रहा है, तो हम जानते हैं कि कॉलबैक निकाल दिया जा रहा है, इसलिए कॉलबैक के कोड में कोई दोष है, कॉलबैक स्वयं नहीं। –

उत्तर

30

मुझे एक ही समस्या थी। before_save मॉडल बदल नहीं होने पर कॉलबैक नहीं कहा जाता है।

आप line_items अपडेट कर रहे हैं, budget नहीं, इसलिए रेल सोचते हैं कि यह अपडेट नहीं है और save पर कॉल नहीं करता है।

आपको before_save से after_validation को बदलने की आवश्यकता है ताकि मॉडल में कोई बदलाव न हो तो भी इसे कॉल किया जाएगा। और जब इस कॉलबैक में आप कुछ विशेषताओं को बदलते हैं, तो रेल देखेंगे कि आपका मॉडल बदल गया है और save पर कॉल करेगा।

+1

स्पर्श काम नहीं करता है, क्योंकि यह कॉलबैक ट्रिगर नहीं करता है ... – Nico

+0

धन्यवाद, @ निको, हटा दिया गया जवाब से है। किसी कारण से मैंने सोचा कि इसे कॉलबैक –

+1

ट्रिगर करना चाहिए, मुझे बाद में सहेजने के साथ एक ही समस्या है, मुझे @Nico – ratnakar

8

पुराना सवाल, मुझे पता है, लेकिन यह अभी भी खोज में सबसे पहले आता है। मैं इस लेख के लिए एक समाधान है लगता है:

Rails, nested attributes and before_save callbacks

मैं (के रूप में @AntonDieterle उसके जवाब में बताते हैं) है कि लेख सही ढंग से, समस्या को समझने हूँ, तो है कि बच्चे कॉलबैक ट्रिगर नहीं है, क्योंकि माता-पिता प्रतिसाद नहीं 'टी "गंदे नहीं। इस आर्कटिकल का समाधान माता-पिता विशेषता पर attr_name_will_change! पर कॉल करके गंदे होने के लिए "मजबूर" करना है, वास्तव में, यह नहीं बदलता है। रेल एपीआई 2 में [सक्रिय मॉडल गंदा] देखें।

के बजाय after_validation का उपयोग करने के एंटोन का समाधान आसान लगता है, लेकिन मैं इसे एक विकल्प चुनना चाहता था।

+0

हमेशा आपके उत्तर के लिंक देखने के लिए पुरस्कृत। धन्यवाद। – tamersalama

+3

पहला लिंक अब – trushkevich

+2

बचाव के लिए WayBackMachine काम नहीं करता है! Http://web.archive.org/web/20150613004201/http://tamersalama.com/2011/11/10/rails-nested-attributes-and-before_save-callbacks आज़माएं –

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