18

मैं एक व्यक्ति के अवतार के लिए एक यूआरएल है कि इस तरह दिखता है वापस जाने के लिए एक विधि के साथ एक मॉडल है:मैं मॉडल से संपत्ति पाइपलाइन में छवियों का संदर्भ कैसे दे सकता हूं?

def avatar_url 
    if self.avatar? 
    self.avatar.url # This uses paperclip 
    else 
    "/images/avatars/none.png" 
    end 
end 

मैं 3.1 पर अपग्रेड करने के बीच में हूँ, इसलिए अब हार्ड-कोडेड कोई भी छवि की जरूरत हो संपत्ति पाइपलाइन के माध्यम से संदर्भित। नियंत्रक या दृश्य में, मैं इसे image_path() में लपेटूंगा, लेकिन मेरे पास मॉडल में वह विकल्प नहीं है। मैं छवि के लिए सही यूआरएल कैसे उत्पन्न कर सकता हूं?

+0

एक और विकल्प: http://stackoverflow.com/questions/9646549/default-url-in-paperclip-broke-with-asset-pipeline- अपग्रेड – James

उत्तर

6

हमने इस समस्या को draper: https://github.com/jcasimir/draper का उपयोग करके हल किया। ड्रेपर हमें अपने मॉडल (विचारों में उपयोग के लिए) के चारों ओर एक रैपर जोड़ने देता है जिसमें सहायता करने वालों तक पहुंच होती है।

+1

अच्छा सुझाव। यह मणि आशाजनक लग रहा है। – lucapette

+0

मेरा मानना ​​है कि ड्रैपर बस ऊपर उल्लिखित @iain के रूप में एक ही सहायक विधि को प्राप्त करना आसान बनाता है। ड्रैपर को बस इतना परिचय देना कि आप सहायक का उपयोग कर सकते हैं, लेकिन एक प्रस्तुति में अन्य तर्क को स्थानांतरित करने के लिए यह समझ में आता है तो सुनिश्चित करें - इसके लिए जाएं। – Lenart

6

व्यक्तिगत रूप से, मुझे नहीं लगता कि आपको वास्तव में एक मॉडल में यह डिफ़ॉल्ट डालना चाहिए, क्योंकि यह एक दृश्य विवरण है। अपने (haml) ध्यान में रखते हुए:

= image_tag(@image.avatar_url || 'none.png') 

या, तो जैसे अपने खुद के सहायक बनाने और उपयोग यह:

= avatar_or_default(@image) 

जब इस तरह बातें रेल में मुश्किल है, यह अक्सर एक संकेत है कि यह वास्तव में नहीं है सही।

+3

मैं अक्सर इसे जेसन में उपयोग करता हूं (as_json के माध्यम से), जो लेता है उस विकल्प को दूर करो। –

2

पेपरक्लिप डिफ़ॉल्ट यूआरएल

has_attached_file :avatar, :default_url => '/images/.../missing_:style.png' 

आप इस का उपयोग कर सकते हैं उपयोगकर्ता मामले में डिफ़ॉल्ट छवि 'की सेवा करने के लिए अपलोड अवतार नहीं किया गया है निर्दिष्ट करने के लिए एक विकल्प है।

+0

दुर्भाग्य से, default_url पैरामीटर को या तो संपत्ति पाइपलाइन सहायक के माध्यम से संसाधित नहीं किया जाता है। –

+13

आप कर सकते हैं ': default_url => ActionController :: Base.helpers.image_path ("/ default_avatar.png") ' – Hengjie

19

मुझे थोड़ी देर के लिए यह अधिकार प्राप्त करने में संघर्ष हुआ, इसलिए मैंने सोचा कि मैं यहां जवाब पोस्ट करूंगा। जबकि उपरोक्त मानक मानक छवि के लिए काम करता है (यानी प्रत्येक पेपरक्लिप शैली के लिए एक ही), यदि आपको कई डिफ़ॉल्ट शैलियों की आवश्यकता है तो आपको एक अलग दृष्टिकोण की आवश्यकता है।

यदि आप डिफ़ॉल्ट यूआरएल संपत्ति पाइपलाइन और परिसंपत्ति सिंक के साथ अच्छा खेलना चाहते हैं और प्रति शैली अलग-अलग डिफ़ॉल्ट छवियां चाहते हैं तो आपको फिंगरप्रिंट के बिना संपत्ति पथ उत्पन्न करने की आवश्यकता है अन्यथा आपको AssetNotPrecompiled त्रुटियों के बहुत सारे मिलेंगे।

तो जैसा:

:default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false) 

या अपने पेपरक्लिप विकल्पों में:

:default_url => lambda { |a| "#{a.instance.create_default_url}" } 

और फिर मॉडल में एक उदाहरण विधि पेपरक्लिप अनुलग्नक है:

def create_default_url 
    ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false) 
end 

इस में मामला आप अभी भी इंटरपोलेशन (शैली) का उपयोग कर सकते हैं लेकिन संपत्ति फिंगरप्रिंटिंग/डाइजेस्ट को बंद करना होगा ।

यह सब तब तक ठीक काम करता है जब तक आप पाचन के साथ-साथ पचाने वाले लोगों के बिना संपत्तियों को सिंक कर रहे हों।

+1

रेल 4, पेपरक्लिप, यह अब आवश्यक नहीं है। ': default_url =>": शैली/missing.jpg "'। कोई अग्रणी '/' नहीं। – nitsujri

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

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