2013-02-08 20 views
16

में एक फ़ील्ड में परिवर्तन को रोकें मेरे पास दो संबंधित मॉडल हैं - मान लें Activity और StepActivity has_many :steps और Step belongs_to :activity जिसका अर्थ है steps के लिए तालिका activity_id कॉलम है।रेल मॉडल

यह होबो 1.3 में है, इसलिए रेल 3.0।

क्या मैं चाहता हूँ यह सुनिश्चित करें कि के बाद Step निर्माण यह एक और Activity करने के लिए एक कदम ले जाना संभव नहीं है। हम activity_id फ़ील्ड को बदलने के लिए नहीं चाहते हैं।

मैंने संपादन फ़ॉर्म से फ़ील्ड को हटा दिया है, लेकिन मैं एक मजबूत बाधा की तलाश में हूं। अनिवार्य रूप से मैं update (create पर नहीं) पर सत्यापन करना चाहता हूं कि कॉलम को छुआ नहीं जा रहा है। होब्स का प्रलेखन Hobo के अंदर इस तरह के किसी भी प्रकार का सुझाव नहीं देता है, इसलिए मैं Rails validations पर देख रहा हूं, लेकिन अब तक मुझे "केवल अपडेट पर यह नहीं करना" बाधा नहीं मिली है, न ही यह मान्य है कि कुछ नहीं है बदल रहा है।

उत्तर

29

आप attr_readonly :your_field_name के साथ read_only के रूप में एक विशेषता घोषित कर सकते हैं। लेकिन यदि आप इस विशेषता को लिखने का प्रयास करते हैं तो यह कोई त्रुटि नहीं बनाएगा, यह चुपचाप विफल हो जाएगा। ,

class Step < ActiveRecord::Base 
    validate :activity_id_not_changed 

    private 

    def activity_id_not_changed 
    if activity_id_changed? && self.persisted? 
     errors.add(:activity_id, "Change of activity_id not allowed!") 
    end 
    end 
end 

persisted? रिटर्न सच है कि अगर यह नहीं है:

एक अन्य विकल्प हो सकता है, इस मामले के लिए एक सत्यापन लिखने के लिए हो सकता है (यह विशेषता सभी एसक्यूएल-अपडेट के लिए नजरअंदाज कर दिया जाएगा), इस प्रकार दिखाई देंगे एक नया रिकॉर्ड और यह नष्ट नहीं हुआ है।

लिंक:

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

+0

'attr_readonly' विज्ञापित के रूप में काम करता है, बी एप के एक और पहलू के साथ एक झुर्रियां हो सकती है। मैं कल सत्यापन दृष्टिकोण का प्रयास करूंगा और देख सकता हूं कि यह बेहतर है या नहीं। – pjmorse

+0

यदि आपको वास्तव में अपने एप्लिकेशन में कहीं और आईडी बदलने की आवश्यकता है, तो आप इसे निम्न के साथ सत्यापन दृष्टिकोण के साथ भी कर सकते हैं: 'step.save (: validate => false)' – Deradon

+0

यह कहीं और कोई परिवर्तन समस्या नहीं है; यह एक वस्तु प्रति है। (इसलिए, हम कहते हैं कि हमने 'गतिविधि' की प्रतिलिपि बनाई है जिस तरह से सभी 'चरणों' की प्रतिलिपि बनाई गई है; किसी कारण से काम नहीं कर रहा है, और मैंने अभी तक कॉपी कोड में पर्याप्त रूप से पर्याप्त रूप से पर्याप्त रूप से इतना नहीं बताया है कि यह परिवर्तन टूट गया है या नहीं ।) – pjmorse

1

मुझे लगता है कि आप होबो अनुमतियाँ प्रणाली के साथ भी ऐसा कर सकते हैं: http://hobocentral.net/manual/permissions

उदाहरण के लिए:

def update_permitted? 
    acting_user.administrator && !activity_id_changed? 
end 
संबंधित मुद्दे