2010-09-16 10 views
5

मैं सक्रिय रिकॉर्ड कॉलबैक को समझने की कोशिश कर रहा हूं, लेकिन वे काम नहीं करते हैं, जैसा कि मैं चाहता हूं।मैं इसे सहेजने से पहले ActiveRecord ऑब्जेक्ट में विशेषताओं को कैसे सेट करूं?

उदा।

मॉडल

Checklist<ActiveRecord... 
attr_accessible :item1, :item2, :done # they are all boolean 

before_save :check_done 

private 
def check_done 
    if item1 && item2 
    write_attribute :done, true 
    else 
    write_attribute :done, false 
    end 
end 

अगर मैं कंसोल में एक वस्तु का दृष्टांत यह काम नहीं करता है और यह को बचाने की कोशिश, आपरेशन बचाने रिटर्न "गलत" :(

क्या इस कोड के साथ गलत क्या है? अग्रिम :) में धन्यवाद

संपादित करें: ऐसा लगता है कि वहाँ कुछ "before_save" कॉल के साथ कुछ गलत है की तरह, अगर मैं "after_save" का उपयोग, कोड काम करता है ... लेकिन विशेषता सहेजा नहीं गया है (जाहिर है)। यह वास्तव में अजीब

संपादित 2 अजीब ... विकास लॉग इस

FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
[0m 
    [1m[35mChecklist Load (0.2ms)[0m SELECT "checklists".* FROM "checklists" ORDER BY checklists.id DESC LIMIT 1 
WARNING: Can't mass-assign protected attributes: id 

से पता चलता लेकिन वह वास्तव में अजीब है, क्योंकि अगर मैं attr_accessible लाइन को हटाने मैं अभी भी इस त्रुटि मिलती है है ...

संपादित 3 किसी को पूछता है, हाँ मैं एक मौजूदा रिकॉर्ड को अपडेट करने की कोशिश कर रहा हूँ।

संपादित 4 हाँ, मैं संपादित करने के लिए अगर मैं कंसोल में टाइप

c.save => # false 
c.errors => #<OrderedHash {}> 
+0

तुम क्यों मतलब है द्वारा यह काम नहीं करता, त्रुटियों क्या हैं? आप yourobject.save – Mike

+0

ओह के बाद yourobject.errors को कॉल करके जांच सकते हैं, ठीक है मुझे यह myobject.errors # tabaluga

+0

'myobject.errors.inspect'' के बारे में कैसे मिलता है ?? – PeterWong

उत्तर

8

आपकी कॉलबैक के साथ समस्या यह है कि false लौटाता है यदि item1 या item2 गलत है।

Active Record Callbacks प्रलेखन से:

एक before_validation कॉलबैक के लौटने मूल्य false लिए मूल्यांकन किया जा सकता है, तो प्रक्रिया निरस्त कर दिया जाएगा और Base#savefalse वापस आ जाएगी।

समाधान सरल है; अपने कॉलबैक के अंत में true वापसी, इसलिए जैसे:

def check_done 
    self.done = (item1 && item2) 
    return true 
end 
+3

धन्यवाद, धन्यवाद, धन्यवाद! Btw। आप सभी को अगर आप बर्लिन आ रहे हैं, तो मुझे एक लाइन छोड़ दो, आपने एक पेय अर्जित किया :) – tabaluga

+0

यह वास्तव में बहुत अच्छा है, मैंने स्वच्छता खोना शुरू कर दिया क्योंकि मैं कॉलबैक के अंत में प्रिंट/रख/स्वयं को प्रिंट करने की कोशिश कर रहा था विधि और महसूस किया कि ऐसा करने से शून्य वापस आ जाएगी जो कॉलबैक को उड़ा देगा। आह! व्हील धन्यवाद! –

0

कृपया कोशिश की तरह है:

def check_done 
    if item1 && item2 
    done = true 
    else 
    done = false 
    end 
end 
+0

हम्मम्म, काम नहीं करता है :( लेकिन मदद के लिए धन्यवाद :) – tabaluga

0

अपने निजी विधि में, कोशिश

def check_done 
    self.done = (self.item1 && self.item2) ? true : false 
end 
+0

बुहुआ, जो या तो काम नहीं करता ... लेकिन आपके प्रयासों के लिए धन्यवाद :) – tabaluga

+0

क्या आपने @ पीटरवॉन्ग समाधान में स्वयं संदर्भ जोड़कर कोशिश करें? – Yannis

+1

आपका मेरे बराबर होना चाहिए ... अन्य समस्याएं होनी चाहिए। @ tabaluga, 'item1',' item2' सही ढंग से सेट (सत्य और गलत जैसा आपने अपेक्षित)। और कॉलम 'किया गया' बुलियन मूल्य में है? या आप कुछ डीबग लॉग जोड़ना चाहते हैं यह देखने के लिए कि क्या वैरिएबल बदलते हैं या नहीं? – PeterWong

2
before_save { |record| 
    record.done = item1 && item2 
} 
+1

धन्यवाद, धन्यवाद, धन्यवाद – tabaluga

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