5
के साथ एक फार्म बिल्डर का निर्माण

मैं कुछ सलाह के लिए देख रहा हूँ मूल रूप से दो वर्गों है कि एक आतंक विरोधी आवेदन के लिए ऊपर डिजाइन करने पर:रूबी और JQuery

1) व्यवस्थापक पर्चा बिल्डर 2) अंतिम उपयोगकर्ता फॉर्म (कि बनाया गया था चरण 1)

मैं JQuery फार्म (अंतिम परिणाम नमूने है) मैं चाहता हूँ और यह "प्रगतिशील प्रकटीकरण" (कार्रवाई पुस्तक में JQuery में Yehuda Katz के बांस उदाहरण की तरह) का उपयोग करता है में व्यवस्थापक द्वारा, इसलिए यदि आप क्लिक करें एक आइटम एक और आइटम खुल सकता है (उदाहरण के लिए "पंजीकरण चेकबॉक्स" पर क्लिक करें और दूसरा पंजीकरण उप-फॉर्म प्रदर्शित होता है)। मेरे पास रेल अनुप्रयोग वास्तव में वर्णित कुछ इनपुट बना रहा है। हालांकि, मुझे लगता है कि मैं वास्तव में रूबी की गतिशील क्षमताओं का उपयोग नहीं कर रहा हूं।

module Levin 
    module EventReg 
    module Jquery 

    def self.simple_registration_text(input_params) 
    raise ArgumentError if input_params.nil? 
    ip_id = input_params[:input_div_id] 
    simple_reg_input_html = '<p><label for="' 
    simple_reg_input_html << "#{ip_id + '_label_id'}\">" 
    ........<A BUNCH MORE CODE TO BUILD INPUT>........ 
    simple_reg_input_html << ' class="required"' unless input_params[:is_required].eql?("0")  
    simple_reg_input_html << '/></p>' 
    end 

असल में, व्यवस्थापक इनपुट आइटम नाम कर सकते हैं और मैं का उपयोग div id के, आदि के लिए है कि मैं यह देखते हुए कि: उदाहरण के लिए, यहाँ है कि एक विशेष साधारण एचटीएमएल इनपुट बनाता है मेरी मॉड्यूल तरीकों में से एक का एक टुकड़ा है कई इनपुट प्रकार हैं (ड्रॉप डाउन, टेक्स्टरेअस, चेकबॉक्स के साथ इनपुट प्रकार टेक्स्ट जैसे बच्चों के साथ इनपुट, चेक किए जाने पर, डेटा ग्रिड खोलता है, जो एक संवाद पॉपअप फॉर्म आदि के माध्यम से आइटम जोड़/हटा सकता है), मैं ' डी उपरोक्त मेरे उदाहरण में "हार्ड-वायरिंग" निर्माण विधियों से बचने के लिए पसंद है। साथ ही, कॉलर को दोनों इनपुट मूल्य विकल्पों के लिए ज़िम्मेदार होने की अनुमति देना बहुत अच्छा होगा (जो इनपुट पैराम पैरामीटर पास करते समय पहले से ही हो रहा है), और बिल्डर स्वयं भी।

मैं बहुत कार्यात्मक प्रोग्रामिंग करने के लिए नया हूँ, लेकिन मैं फोन करने वाले एक "निर्माता" लैम्ब्डा कि विशिष्ट रूप इनपुट वे इनपुट का उपयोग कर की जरूरत है बनाता है में पास करने का प्रभावित करने के लिए कुछ के बारे में सोच रहा हूँ करने के लिए अग्रणी पैरामीटर:

builder_lambda.call(input_params)

लेकिन जब मैं इसके बारे में सोचता हूं, ऐसा लगता है कि लैम्ब्डा जेक्री मॉड्यूल पहले से ही क्या कर रहा है। हां, कॉलर के पास अपनी पसंद के लिए कस्टम बिल्डर बनाने की क्षमता होगी, लेकिन फिर मेरी मॉड्यूल विधि वास्तव में क्या करेगी! यह क्या मूल्य प्रदान करेगा?

मुझे कभी-कभी इन इनपुट को विशिष्ट ईवेंट हैंडलर से कनेक्ट करने की आवश्यकता होगी।

builder_lambda.call(input_params)

add_event_handlers_lambda.call(input_params)

मैं सही रास्ते पर हूँ: शायद वहाँ lamdas की एक सरणी, एक बिल्डर और की तरह एक ऐड ईवेंट हैंडलर हो सकता है? खेद है कि अगर मैं जुआ कर रहा हूं, लेकिन मुझे स्पष्ट रूप से इस समस्या को "रूबी-इटिकिक" समाधान में विघटित करने में समस्या हो रही है और अधिक गतिशील दृष्टिकोण के विचारों की सराहना की जाएगी।

संपादित करें: यह मेरे लिए मददगार था: Obie Fernandez DSL Development PDF

+0

@Rob, मैं एक समान परियोजना पर काम कर रहा हूं, और आपके द्वारा दिया गया लिंक बहुत उपयोगी था। चीयर्स! – Anurag

+0

सवाल क्या है? = पी – thomasfedb

+4

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

उत्तर

1

यह अपने विचार मुकाबला करने के लिए ध्वनि सकता है, लेकिन मुझे लगता है कि आप इस के साथ संघर्ष कर रहे हैं, क्योंकि तुम क्या चाहते पहिया (पुनर्रचना है एक मेटा-भाषा जहां बनाने के हिस्से आपके द्वारा उपयोग किए जा रहे ढांचे पहले से ही उपकरण प्रदान करते हैं)।

मेरे दृष्टिकोण पंक्तियों के साथ कुछ होगा: (: Handlebars या jQuery.tmpl मेरी पसंद)

अपने partials के लिए HTML टेम्पलेट्स (अपने ध्यान में रखते हुए) बनाएँ जावास्क्रिप्ट टेम्पलेट इंजन के कुछ प्रकार का उपयोग कर। अभी तक कोई बिल्डर्स नहीं।

<script id="form-partial-registration" type="text/x-handlebars-template"> 
<div class="registration_field field"> 
    <label for="{{field_id}}" id="label_for_{{field_id}}" class="label registration"></label> 
    <input id="{{field_id}}" /> 
</div> 
</script> 

फिर अपने जावास्क्रिप्ट में बस टेम्पलेट

var form_builder = {templates:{}}; 
function compile_template(template_id, key) { 
    form_builder.templates[key] = Handlebars.compile($("#" + template_id).html()); 
} 
function render_template(template_id, data) { 
    form_builder.templates[key](data); 
} 

// other stuff 

compile_template('form-partial-registration', 'registration') 

संकलन तो आप अपने रूपों, स्पष्ट रूप से करने के बजाय एचटीएमएल जावास्क्रिप्ट में लिखा के लिए आवश्यक एचटीएमएल कोड के हर भाग का एक संग्रह है। फिर उन्हें का उपयोग करें:

function build_some_form(has_registration, has_expiration, event_handlers) { 
    var form_content = []; 
    var form_prefix = '...some_prefix...' 

    // something optional 
    if (has_registration) { 
    form_content.push(render_template('registration', {field_id:form_prefix + '_reg'})) 
    } 

    // another optional 
    if (has_expiration) { 
    form_content.push(render_template('expiration', {field_id:form_prefix + '_exp'})) 
    } 

    // put it into the form 
    $('#some_form').append(form_content.join('')); 


    // hook up handlers, in this example for onclick only 
    for(var k in event_handlers) { 
    $('#some_form #' + form_prefix + '_' + k).click(event_handlers[k]); 
    } 
} 

build_some_form(true, false, {reg: function() { alert('registration clicked') }) 

मेरे बिंदु है: आपके आवेदन की "व्यापार तर्क" पर ध्यान केंद्रित करें, और आराम के लिए सादगी के लिए लक्ष्य (योएल Spolsky व्याख्या करने के लिए: अपने मूल क्षमता के लिए गहराई से देखभाल और आउटसोर्स करने की कोशिश/बाकी नकली)।

बेशक यह सिर्फ एक बहुत ही किसी न किसी मसौदा, दृष्टिकोण मैं लेने के लिए और यहां से इसे परिष्कृत होता है (यहां repetitions के एक जोड़े, कि पुनर्संशोधित किया जा सकता है)।

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