2011-09-23 12 views

उत्तर

18

में के रूप में अपने कस्टम सत्यापन विधि, एक ही परिभाषित MiniMagick का उपयोग क्यों नहीं करें? संशोधित DelPiero का जवाब:

validate :validate_minimum_image_size 

def validate_minimum_image_size 
    image = MiniMagick::Image.open(picture.path) 
    unless image[:width] > 400 && image[:height] > 400 
    errors.add :image, "should be 400x400px minimum!" 
    end 
end 
+0

कूल! आपका रास्ता वास्तव में बेहतर है। – Kir

+1

@skalee मुझे निम्न त्रुटि मिल रही है: Errno :: फ़ोटो नियंत्रक में ENOENT # कोई ऐसी फ़ाइल या निर्देशिका नहीं - यह क्यों है? – Gibson

+0

मुझे लगता है कि कोड में एक त्रुटि है। यदि आपकी तस्वीर विशेषता 'चित्र' है, तो आप 'चित्र' विशेषता में त्रुटियां जोड़ देंगे, नहीं ''image' – Anwar

8

यह मुझे हैरान कर दिया कितना मुश्किल यह एक स्पष्ट तरीका छवि चौड़ाई & CarrierWave साथ ऊंचाई को मान्य करने के लिए चारों ओर खोज करने के लिए किया गया था। उपरोक्त @ किरण का समाधान सही है, लेकिन मैं यह समझाने में एक कदम आगे जाना चाहता था कि उसने क्या किया, और मामूली बदलाव किए।

यदि आप उसकी जिस्ट https://gist.github.com/1239078 देखते हैं, तो इसका जवाब अपलोडर क्लास में before :cache कॉलबैक में है। जादू लाइन

model.avatar_upload_width, model.avatar_upload_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i } 
उनके मामले में

है, avatar_upload_width & avatar_upload_height अपने उपयोगकर्ता मॉडल की विशेषताएँ हैं।

attr_accessor :image_width, :image_height 

याद रखें, आपके द्वारा चयनित विशेषताओं जब एक साथ खिलवाड़ हाथ पर करना चाहते हैं के लिए attr_accessor उपयोग कर सकते हैं: मैं नहीं करने के लिए है डेटाबेस में चौड़ाई & ऊंचाई स्टोर करने के लिए है, तो अपने मॉडल में मैंने कहा था चाहता था रिकॉर्ड, लेकिन बस उन्हें डीबी पर जारी नहीं रखना चाहते हैं। तो मेरी जादू लाइन वास्तव में तो अब मॉडल वस्तु में संग्रहीत मेरी छवि की चौड़ाई & ऊंचाई

model.image_width, model.image_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i } 

में बदल रहा है। अंतिम चरण के आयाम के लिए एक कस्टम सत्यापन लिखने के लिए है, इसलिए अपने मॉडल में आप की तरह

validate :validate_minimum_image_size 

कुछ चाहिए और फिर यह नीचे सार

# custom validation for image width & height minimum dimensions 
def validate_minimum_image_size 
    if self.image_width < 400 && self.image_height < 400 
     errors.add :image, "should be 400x400px minimum!" 
    end 
end 
+0

इस तरह के एक गहरी व्याख्या के लिए धन्यवाद! – Kir

+2

मैं सिर्फ आभारी हूं कि मुझे अपना कोड नमूना कैसे मिला है, यह पागल है कि ऐसा प्रतीत होता है कि ऐसा प्रतीत होता है कि इस तरह का एक आम ऑपरेशन इतना खराब दस्तावेज है! – DelPiero

12

मैं @ skalee के जवाब पर

class ImageSizeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    unless value.blank? 

     image = MiniMagick::Image.open(value.path) 
     checks = [ 
     { :option => :width, 
      :field => :width, 
      :function => :'==', 
      :message =>"Image width must be %d px."}, 
     { :option => :height, 
      :field => :height, 
      :function => :'==', 
      :message =>"Image height must be %d px."}, 
     { :option => :max_width, 
      :field => :width, 
      :function => :'<=', 
      :message =>"Image width must be at most %d px."}, 
     { :option => :max_height, 
      :field => :height, 
      :function => :'<=', 
      :message =>"Image height must be at most %d px."}, 
     { :option => :min_width, 
      :field => :width, 
      :function => :'>=', 
      :message =>"Image width must be at least %d px."}, 
     { :option => :min_height, 
      :field => :height, 
      :function => :'>=', 
      :message =>"Image height must be at least %d px."}, 
     ] 

     checks.each do |p| 
     if options.has_key?(p[:option]) and 
      !image[p[:field]].send(p[:function], options[p[:option]]) 

      record.errors[attribute] << p[:message] % options[p[:option]] 
     end 
     end 

    end 
    end 
end 

validates :image, :image_size => {:min_width=>400, :min_height => 400} की तरह इसका इस्तेमाल आधारित एक से थोड़ा अधिक पूर्ण सत्यापनकर्ता बनाया है।

+0

यह कमाल है! – Kir

+0

बहुत उपयोगी। इसे साझा करने के लिए आपको धन्यवाद। –

+0

महान काम आदमी! –

5

मैंने अभी एक कस्टम सत्यापनकर्ता बनाया है जिसका उद्देश्य अधिक रेल 4+ वाक्यविन्यास अनुकूल होना है।
मैंने इस धागे पर अन्य प्रतिक्रियाओं से विचार लिया।
यहाँ सार है: https://gist.github.com/lou/2881f1aa183078687f1e

और तुम इस तरह इसका इस्तेमाल कर सकते हैं:

validates :image, image_size: { width: { min: 1024 }, height: { in: 200..500 } } 

इस विशेष मामले में यह होना चाहिए:

validates :image, image_size: { width: 150, height: 150 } 
संबंधित मुद्दे