2012-03-26 6 views
9

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

Desired Form Output

मैं इस काम के लिए मिला है, लेकिन यह आवश्यक है कि मैं कस्टम HTML मार्कअप, जिसका अर्थ है कि किसी भी समय Formtastic में परिवर्तन उत्पादन प्रारूप, मैं अपने मिलान एचटीएमएल अद्यतन करने की आवश्यकता का उपयोग करें। यहाँ क्या मैं अभी कर लिया है:

<%= form.inputs do %> 
    <% if form.object.new_record? -%> 
     <%= form.input :image, :required => true, :hint => 'Maximum size of 3MB. JPG, GIF, PNG.' %> 
    <% else -%> 
     <li class="file input required" id="profile_image_input"> 
      <label class="label" for="profile_image">Image</label> 
      <%= image_tag form.object.image.url(:thumb), :class => 'attachment' %> 
      <%= form.file_field :image %> 
      <p class="inline-hints">Maximum size of 3MB. JPG, GIF, PNG.</p> 
     </li> 
    <% end -%> 
<% end %> 

आदर्श रूप में, यह निम्नलिखित है, जहां input_html इनपुट, संकेत के लिए सृजित HTML माना जाता है, आदि .:

की तरह अधिक कुछ करने के लिए अच्छा होगा
<%= form.inputs do %> 
    <%= form.input :image, :required => true, :hint => 'Maximum size of 3MB. JPG, GIF, PNG.' do |input_html| %> 
     <%= image_tag form.object.image.url(:thumb), :class => 'attachment' unless form.object.new_record? %> 
     <%= input_html %> 
    <% end %> 
<% end %> 

इस तरह कुछ भी पहले से ही मौजूद है? या क्या कोई और ऐसा विकल्प है जो मेरे जीवन को आसान बना देगा?

उत्तर

20

खैर, मैं इस अपने आप को निश्चित रूप से हल किया। जैसा कि मैं यहां पोस्ट करता हूं हमेशा होता है। : पी

समान कुछ करने के लिए देख किसी को भी के लिए, मैं एक कस्टम इनपुट Formtastic की फ़ाइल इनपुट से प्राप्त प्रकार बनाया।

class AttachmentInput < Formtastic::Inputs::FileInput 
    def image_html_options 
    {:class => 'attachment'}.merge(options[:image_html] || {}) 
    end 

    def to_html 
    input_wrapping do 
     label_html << 
     image_html << 
     builder.file_field(method, input_html_options) 
    end 
    end 

protected 

    def image_html 
    return "".html_safe if builder.object.new_record? 

    url = case options[:image] 
    when Symbol 
     builder.object.send(options[:image]) 
    when Proc 
     options[:image].call(builder.object) 
    else 
     options[:image].to_s 
    end 

    builder.template.image_tag(url, image_html_options).html_safe 
    end 
end 

अब मैं सिर्फ निम्नलिखित तरीके से इस प्रकार के एक इनपुट बना सकते हैं:

<%= form.input :image, :as => :attachment, 
         :required => true, 
         :hint => 'Maximum size of 3MB. JPG, GIF, PNG.', 
         :image => proc { |o| o.image.url(:thumb) } %> 

वैकल्पिक रूप से, :image टैग में से एक को स्वीकार कर सकते हैं:

  • एक प्रोक, जो गुजरता प्रपत्र की वस्तु परम,
  • एक प्रतीक है, जो वस्तु पर एक विधि का नाम है,
  • कुछ और, जो एक स्ट्रिंग में परिवर्तित हो गया है और यूआरएल का प्रतिनिधित्व करने के लिए माना जाता है।

    Create a file in app/inputs with a filename ending in _input.rb 
    

    एक पूर्ण समाधान के लिए पर्याप्त नहीं है:

साथ ही, मैं https://github.com/justinfrench/formtastic#modified--custom-inputs पर Formtastic डॉक्स के तल में एचटीएमएल कक्षाएं, पहचान-पत्र, आदि

+4

हाँ, अच्छा लग रहा है। मेरे पास बहुत से कस्टम इनपुट हैं जो इस तरह की चीजें करते हैं, या अक्षम इनपुट में स्ट्रिंग के रूप में मान प्रदर्शित करते हैं। –

+3

मैं स्रोत कोड में संपादन/जोड़ने के लिए नया हूं। आपने अटैचमेंट इनपुट क्लास कहां रखा? क्या आपने अपनी रेल लिब फ़ोल्डर में कक्षा बनाई थी?क्या आपने इसे इनपुट फ़ोल्डर में रखा था? यदि इनपुट फ़ोल्डर में आप विभिन्न संस्करणों का प्रबंधन कैसे करते हैं? यदि जस्टिन ने कोड बेस अपडेट किया तो क्या होगा? – ebbflowgo

+0

@ebbflowgo, मैंने उपरोक्त कोड को 'ऐप/इनपुट/attachment_input.rb' में चिपकाया और यह काम करता है। – ShadSterling

7

निर्दिष्ट करने के लिए :image_html विकल्प का उपयोग कर सकते हैं , लेकिन प्रेरणा के लिए फॉर्मेटास्टिक स्रोत के माध्यम से rooting के बाद निम्नलिखित के साथ आने में सक्षम था जो मेरे लिए अच्छा काम कर रहा है।

एप्लिकेशन/आदानों/label_input.rb में

:

class LabelInput 
    include Formtastic::Inputs::Base 

    def to_html 
     input_wrapping do 
      label_html << 
      "#{@object.send(method)}" 
     end 
    end 
    end 

पृष्ठ पर ActiveAdmin का उपयोग करने की रूप में, होती हैं:

form do |f| 
    f.inputs do 
    f.input :project 
    f.input :date_consumed 
    f.input :total_consumed 
    f.input :computed_waste, :as => :label 
    f.actions 
    end 
end 
संबंधित मुद्दे