इस तरह की चीज एक रेल परिप्रेक्ष्य से समस्याग्रस्त है क्योंकि छवि अपलोड करने के तरीके के कारण। यह बेहतर काम करने के लिए एक रणनीति है:
- अपनी छवि को अपलोड करने के लिए एक उप-विधि बनाएं संभवतः यह अधिक सुव्यवस्थित बनाने के लिए swfupload का उपयोग कर।
- अपने अपलोड प्राप्त करने के लिए एक मॉडल बनाएं जिसमें कुछ यादृच्छिक एक्सेस कुंजी शामिल हो और इसे लिंक किया जा सके। पेपरक्लिप संलग्न फाइल को संभालती है।
- एक छिपे हुए फ़ील्ड को सम्मिलित करके, या संभावित रूप से एक दृश्यमान चेक-बॉक्स तत्व को उपयुक्त रूप से एक दृश्यमान चेक-बॉक्स तत्व डालने के लिए AJAX का उपयोग करें, जब सबफॉर्म समाप्त हो जाए।
एक ठेठ मॉडल कुछ इस तरह दिखता है:
class Avatar < ActiveRecord::Base
has_attached_file :image
# ... Additional Paperclip options here
before_validation :assign_unique_key
belongs_to :user
def to_param
self.unique_key
end
protected
def assign_unique_key
return if (self.unique_key.present?)
self.unique_key = Digest::SHA1.hexdigest(ActiveSupport::SecureRandom.random_number(1<<512).to_s)
end
end
unique_key क्षेत्र के लिए कारण होता है ताकि आप एक संभावित न सहेजा गया रिकॉर्ड के रूप में इस लिंक कर सकते हैं। आईडी के बजाय इसे URL में डालने के बजाय अद्वितीय_की का उपयोग करना फायदेमंद है क्योंकि यह कहना मुश्किल है कि उपयोगकर्ता को यह तस्वीर देखने में सक्षम होना चाहिए या नहीं जब यह अपलोड किया गया है क्योंकि मालिक उपयोगकर्ता को अभी तक असाइन नहीं किया जा सकता है।
यह उत्सुक लोगों को आपके यूआरएल में किसी प्रकार की अनुक्रमिक, आसानी से अनुमानित आईडी बदलने और अपलोड किए जाने वाले अन्य अवतार देखने से रोकता है।
आप अवतार के लिए अंतिम आकार के थंबनेल यूआरएल को पुनः प्राप्त कर सकते हैं क्योंकि आप इस बिंदु पर कोई मॉडल करेंगे।
आप आसानी से प्राप्त होने पर मानकों को निकाल देते हैं और अवतार आईडी नंबर के लिए वापस अनुवाद कर सकते हैं:
# If an avatar_id parameter has been assigned...
if (params[:user][:avatar_id])
# ...resolve this as if it were a unique_key value...
avatar = Avatar.find_by_unique_key(params[:user][:avatar_id])
# ...and repopulate the parameters if it has been found.
params[:user][:avatar_id] = (avatar && avatar.id)
end
# ... params[:user] used as required for create or update
लोगों को अपलोड करने और फिर से अपलोड छवियों के रूप में, आप अंततः अनाथ अभिलेख नहीं हैं की एक बड़ी संख्या होगा वास्तव में कहीं भी इस्तेमाल किया। उचित समय बीतने के बाद इन सभी को शुद्ध करने के लिए एक रेक कार्य लिखना आसान है। उदाहरण के लिए:
task :purge_orphan_avatars => :environment do
# Clear out any Avatar records that have not been assigned to a particular
# user within the span of two days.
Avatar.destroy_all([ 'created_at<? AND user_id IS NULL', 2.days.ago ])
end
destroy_all का प्रयोग के रूप में अच्छी तरह से सभी पेपरक्लिप सामग्री के शुद्धिकरण का प्रभाव होना चाहिए।