2013-02-08 17 views
6

मैं बहुत की तरह एक संग्रह के लिए चेक बॉक्स की सूची तैयार कर रहा हूँ करने के लिए एक मूल्य-आधारित डेटा गुण जोड़ना एक चयन विजेट का मूल्य फॉर्म में ऊपर है। (उदाहरण के लिए रोबोट से "ट्रैकर रोबोट" चुनने का अर्थ है कि "पैर" भाग चेकबॉक्स गायब हो जाता है और "व्हील" चेकबॉक्स प्रकट होता है, आदि)एक simple_form चेकबॉक्स संग्रह

मैं जो करना चाहता हूं वह प्रत्येक को एक गणना डेटा विशेषता संलग्न करता है व्यक्तिगत भाग चेकबॉक्स, विशेषता मूल्य के साथ रोबोट सूचीबद्ध करता है जो उस भाग का उपयोग कर सकते हैं; तो कुछ जेएस चेकबॉक्स को छिपाने/दिखाने का काम करेंगे। हालांकि, मुझे नहीं पता कि मैं सरल_फॉर्म का उपयोग करके उन डेटा विशेषताओं को कैसे उत्पन्न कर सकता हूं।

मैं आमतौर पर कस्टम "पार्ट्स" इनपुट बनाउंगा, लेकिन कस्टम संग्रह इनपुट बनाने में कोई समस्या है; यह form_builder.rb के अंदर एक नामित विधि (collection_parts) की तलाश करता है, जो अस्तित्व में नहीं होगा, और यदि मैं फॉर्मबिल्डर को आजमाकर विस्तारित करता हूं तो यह मुझे एक प्रमुख खरगोश छेद भेजता है।

मैं जेनरेट किए गए एचटीएमएल में डेटा एटर्स लोड करने के लिए कुछ जेएस लिख सकता हूं, लेकिन फिर मुझे अपने रेल डेटा के आधार पर कस्टम जेएस जेनरेट करना होगा, और ऐसा करने के गलत तरीके की तरह लगता है।

उत्तर

7

मुझे लगता है कि आप इसे इस प्रकार कर सकते हैं:

= f.input :parts do 
    = f.collection_check_boxes :parts, @parts_list, :id, :to_s, item_wrapper_tag: :label, item_wrapper_class: :checkbox do |b| 
    - b.check_box(data: { YOUR DATA ATTRIBUTES HERE }) + b.text 
+0

लेकिन आप कैसे इस गतिशील रूप से कर सकते हैं करने के लिए जाना यह काम कर देख सकते हैं? इसके खिलाफ बाध्य करने के लिए कोई चर नहीं है ... – andrewdotnich

+1

b.object संग्रह का व्यक्तिगत तत्व है, इसलिए आप डेटा जैसी चीजें कर सकते हैं: {पहचानकर्ता: b.object.identifier} आदि, जो समूह में प्रत्येक चेकबॉक्स को अपने डेटा देगा विशेषता (यदि आप इसे input_html में डालते हैं तो उन सभी के लिए समान मान के विपरीत) –

+0

सबसे पहले, प्रतिक्रिया में साढ़े डेक के लिए खेद है! मुझे यह जवाब सबसे अच्छा लगता है क्योंकि यह इतना आसान है, भले ही अभी भी रूबी और जेएस कोड लिखने के लिए पर्याप्त है। मैंने इसका परीक्षण नहीं किया है (मैं लंबे समय से उस परियोजना और नियोक्ता दोनों से आगे बढ़ गया हूं) लेकिन - यह मानते हुए कि यह काम करता है - डेटा तत्व में प्रत्येक भाग के लिए रोबोट की सूची डालने से समझ में आता है और गतिशील रूप से आसान होता है के खिलाफ मैच धन्यवाद! – yoz

0

SimpleForm में कुछ इनपुट विकल्प एक लैम्ब्डा एक संग्रह में हर आइटम के लिए बुलाया जाता है कि स्वीकार करते हैं:

f.input :role_ids, :collection => (1..10).to_a, 
    :label_method => :to_i, :value_method => :to_i, 
    :as => :check_boxes, :required=> true, 
    :disabled => ->(item){ item.even? } 

लेकिन input_html नहीं है उनमें से एक प्रतीत होता है।

समाधान शायद एक कस्टम SimpleForm संग्रह इनपुट बनाने के लिए है जो डेटा विशेषताओं को लागू करता है। शायद लचीला नहीं है, लेकिन मुझे लगता है कि अब यह एकमात्र तरीका है।

There's a tutorial page on GitHub जो आपको शुरू करना चाहिए।

9

मान लें कि यह फ़ॉर्म Order मॉडल के लिए है और आप संग्रह को region नामक फ़ील्ड के मान के आधार पर बदल रहे हैं।

फ़ॉर्म दृश्य अपडेट करें। फॉर्म के लिए आईडी निर्दिष्ट करें, region फ़ील्ड और parts फ़ील्ड।

= simple_form_for(@order, :html => { :id => "order-form"}) do |f| 
    = f.input :region, :wrapper_html => { :id => "order-form-region",      | 
     "data-parts-url" => parts_orders_path(:id => @order.id, :region => @order.region)} | 

    = f.input :parts, as: check_boxes, collection: @parts_list,       | 
     :wrapper_html => { id' => 'parts-check-box-list'}         | 

route.rb फ़ाइल में parts नामक एक नया एक्शन जोड़ें।

resources :orders do 
    collection do 
    get :parts 
    end 
end 

अपने नियंत्रक

class OrdersController < ApplicationController 

    # expects id and region as parameters 
    def parts 
    @order = params[:id].present? ? Order.find(params[:id]) : Order.new 
    @parts_list = Part.where(:region => params[:region]) 
    end 
end 

के लिए नया एक्शन जोड़ें एक सहायक

def parts_collection(order, parts_list) 
    "".tap do |pc| 
    # to generate the markup for collection we need a dummy form 
    simple_form_for(order) do |f| 
     pc << f.input(:parts, as: check_boxes, collection: parts_list, 
     :wrapper_html => {:id => 'parts-check-box-list'}) 
    end 
    end 
end 

जोड़े कार्रवाई (orders/parts.js.erb)

$('#parts-check-box-list').replaceWith('<%= j(parts_collection(@order, @parts_list)) %>'); 

रजिस्टर डेटा के लिए एक js दृश्य जोड़े घटना बदलें अपने application.js

$(document).ready(function() { 
    $('#order-form').on("change", "#order-form-region", function() { 
    // Access the data-parts-url set in the region field to submit JS request 
    $.getScript($(this).attr('data-parts-url')); 
    }); 
}); 
+0

कोड में बग फिक्स्ड। –

+0

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

1

में region क्षेत्र के लिए संचालकों यह आसान हो सकता।

अनुमान

@robots - an array containing the list of robots 
@parts - a hash containing a list of parts for each robot 

नमूना कोड

# controller 
@robots = %w[tracker nontracker] 
@parts = { tracker: %w[wheels lcd resistor], nontracker: %w[lcd resistor] } 

# view 
= f.input :robots, as: :select, collection: @robots, input_html: { id: 'robot-select' } 

#parts-list 

:javascript 
    var parts = #{@parts.to_json}; 

    $(document).ready(function() { 
    $('#robot-select').change(function() { 
     $('#parts-list').html(''); 

     $(parts[$(this).val()]).each(function(index, text) { 
     $('#parts-list').append('<input type="checkbox" value=' + text + '>' + text + '</input>') 
     })   
    }) 
    }) 

अगर आप https://github.com/jvnill/simple_form_search_app क्लोन और /robots

+0

सबसे पहले, जवाब में डेढ़ देरी के लिए खेद है! मुझे यह पसंद है कि कोड इस के लिए कितना आसान है, यह छोटा है। एकमात्र चीज जो मुझे पसंद नहीं है वह यह है कि यह क्लाइंट साइड पर फॉर्म का एक हिस्सा बना रहा है, और मुझे अभी भी चेकबॉक्स को भागों के लिए सही नाम देने की जरूरत है। लेकिन आपका शुक्रिया! – yoz

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