2010-04-28 14 views
12

मेरे पास पहले_सेव विधि है जिसे मैं कॉल करता हूं जो अपलोड की गई छवि का नाम बदलता है।रेल: अगर कुछ शर्तों को पूरा किया जाता है तो मैं केवल पहले_सेव कैसे चला सकता हूं?

before_save :randomize_file_name 

def randomize_file_name 
    extension = File.extname(screen_file_name).downcase 
    key = ActiveSupport::SecureRandom.hex(8) 
    self.screen.instance_write(:file_name, "#{key}#{extension}") 
end 

यह विधि मेरे Item मॉडल का हिस्सा है।

जब मैं कोई नया आइटम बनाता हूं या किसी आइटम से जुड़े छवि को अपडेट करने की आवश्यकता होती है तो यह बहुत अच्छा काम करता है ... लेकिन समस्या यह है कि अगर मुझे कोई आइटम अपडेट करने की आवश्यकता है लेकिन छवि नहीं है, तो randomize_file_name विधि अभी भी चलती है और डेटाबेस में फ़ाइल का नाम बदलता है (हालांकि फाइल स्वयं ही नहीं है)।

तो, मुझे लगता है कि अगर फ़ाइल फॉर्म जमा करने में फ़ाइल शामिल है तो मुझे केवल randomize_file_name चलाने का एक तरीका पता लगाने की आवश्यकता है ... लेकिन मुझे यकीन नहीं है कि इसे कैसे खींचें।

उत्तर

12

dirty objects का उपयोग करें।

before_save :randomize_file_name 

def randomize_file_name 
    # assuming the field that holds the name 
    # is called screen_file_name 
    if screen_file_name_changed? 
    extension = File.extname(screen_file_name).downcase 
    key = ActiveSupport::SecureRandom.hex(8) 
    self.screen.instance_write(:file_name, "#{key}#{extension}") 
    end 
end 
+0

यहां अधिक विस्तृत दस्तावेज: http://apidock.com/rails/ActiveRecord/Dirty –

+1

यह इसे या तो नहीं मिलेगा। क्या होगा यदि उपयोगकर्ता एक ही फ़ाइल नाम के साथ एक नई फाइल अपलोड करता है? इस मामले में file_name समान होगा लेकिन आप एक अलग कुंजी चाह सकते हैं। –

0

बस फ़ंक्शन के शीर्ष पर एक त्वरित जांच करें और यदि आपको कुछ भी करने की आवश्यकता नहीं है तो वापस लौटें। टिप्पणी के बाद

def randomize_file_name 
    return unless screen_file_name # or whatever check you need to do 
    extension = File.extname(screen_file_name).downcase 
    key = ActiveSupport::SecureRandom.hex(8) 
    self.screen.instance_write(:file_name, "#{key}#{extension}") 
end 

संपादित करें:

आप के रूप में सिमोन Carletti ने उल्लेख किया गंदा वस्तु का उपयोग कर सकते हैं, या आप रचनात्मक प्राप्त कर सकते हैं।

मॉडल में:

attr_accessor :some_random_field_name_for_you_to_rename 

def randomize_file_name 
    return unless some_random_field_name_for_you_to_rename 
    extension = File.extname(screen_file_name).downcase 
    key = ActiveSupport::SecureRandom.hex(8) 
    self.screen.instance_write(:file_name, "#{key}#{extension}") 
end 

रूप में:

<%= f.hidden_field :some_random_field_name_for_you_to_rename, :value => "1" %> 
+0

लेकिन समस्या यह है कि यदि फॉर्म में कोई अपलोड नहीं है, तो यह उस आईडी के लिए डेटाबेस से "screen_file_name" खींचता है ... मुझे विशेष रूप से जांच करने की आवश्यकता है कि फ़ॉर्म सबमिशन में क्या शामिल है छवि फ़ील्ड के लिए कुछ भी ... और मुझे नहीं पता कि मॉडल से ऐसा कैसे करें। – Shpigford

1

आगे जाना है और हर बचाने पर अपने before_save विधि कहा जाता है, लेकिन विधि के अंदर एक पहला कदम के रूप में आप अब कहा जाता रहा है कर रहे हैं "सहेजने से पहले" आपके पास ऐसी स्थिति होनी चाहिए जो आपको आवश्यक विशिष्ट मामले के लिए परीक्षण करे।

4
before_save :randomize_file_name 

def randomize_file_name 
    if screen_file_name 
    extension = File.extname(screen_file_name).downcase 
    key = ActiveSupport::SecureRandom.hex(8) 
    return self.screen.instance_write(:file_name, "#{key}#{extension}") unless !screen_changed? 
    end 
end 

यह जाँच करता है केवल यदि फ़ाइल बदल गया है। काम करता है 90% समय

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

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