2010-12-13 8 views
7

मैं एक प्लगइन बनाने की योजना बना रहा हूं जो ककड़ी परिदृश्यों के आधार पर ऐप कोड उत्पन्न करेगा, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं यहां पहिया को पुनर्निर्मित नहीं कर रहा हूं। क्या किसी को प्लगइन के बारे में पता है जो ककड़ी के साथ काम करता है और मॉडल, नियंत्रक और विचार उत्पन्न करता है?क्या कोई रेल प्लगइन है जो ककड़ी परिदृश्यों का उपयोग कर मॉडल, विचार आदि उत्पन्न कर सकता है?

अगर मैं समझ में नहीं आता हूं तो बस कुछ करने की कोशिश कर रहा हूं।

  1. स्केच बाहर 2 मेरी व्हाइटबोर्ड पर उच्च स्तर के डिजाइन के प्रकार: जब मैं एक नया आवेदन बनाने के यहाँ मेरे कार्यप्रवाह है। 1 जो मॉडल और रिश्ते दिखाता है और दूसरा जो लेआउट, फॉर्म इत्यादि के लिए कुछ आदिम स्क्रीन दिखाता है

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

  3. मैं ककड़ी परिदृश्य चलाता हूं और पहली विफलता को देखता हूं और वहां से कोडिंग शुरू करता हूं। मेरे रेल ऐप को मेरी वरीयताओं में कॉन्फ़िगर करने के लिए इस चरण से पहले आमतौर पर कुछ अतिरिक्त सेटअप होता है और मुझे लगता है कि रत्न शामिल हैं जो मैं उपयोग करूंगा। मुझे अपनी फीचर फाइलों को चलाने के लिए लॉजिकल ऑर्डर भी मिलता है क्योंकि कुछ दूसरों पर निर्भर होते हैं। स्पष्ट रूप से प्रमाणीकरण जैसी चीजों से शुरू करना।

  4. फिर मैं एक परिदृश्य पारित करने के लिए आवश्यक कोड बनाने में मदद के लिए रेल जनरेटर (मचान या सिर्फ मॉडल) का उपयोग करता हूं। मैं जो कुछ चाहता हूं उसे देने के लिए जनरेटर टेम्पलेट्स में से कुछ को बदलता हूं।

  5. फिर यदि आवश्यक हो तो जेनरेट कोड को ट्वीक करें। अधिकांश बार इसमें मॉडल में संबंध स्थापित करना, विचारों में एसोसिएशन के साथ काम करना, और किसी अन्य गैर मानक कार्यक्षमता को शामिल करना शामिल नहीं है जो मचान प्रदान नहीं कर सकता है।

  6. मैं यदि आवश्यक हो तो मेरी माइग्रेशन चलाने

  7. तब मैं अपने परिदृश्यों को फिर से चलाएं और जब तक परिदृश्य गुजरता 4-6 में किसी भी चरण दोहराएं।

  8. सभी परिदृश्य पास होने तक चरण 4-7 दोहराएं।

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि बहुत से लोग शायद इसी तरह के दृष्टिकोण का उपयोग करते हैं। जो चीज मुझे परेशान करती है वह यह है कि मैं परिदृश्य लिखने और कोड बनाने/ट्विकिंग कोड के बीच दोहराव देखता हूं। मैं अपने ककड़ी परिदृश्यों के साथ अपने ऐप के स्केलेटन को उत्पन्न करने में सक्षम होना चाहता हूं और जेनरेट किए गए कस्टमाइज़ को अनुकूलित करने में मेरी सहायता करने के लिए चरण परिभाषाओं का उपयोग करना चाहता हूं।

Scenario: MODEL widget exists 
    Given a widget model exists 
    Then it should belong to a "manufacturer" 
    And it should have a "quantity:integer" field 
    And it should validate the presence of "quantity" 
    And it should have many "wadgets" 
    And it should accept nested attributes for "wadgets" 
    #etc... 

Scenario: VIEW new widget page 
    Given I am on the new widgets page 
    Then I should see a "quantity" field 
    And I should see a "wadgets:name" nested field 
    And I should see a button with text "Save Widget" 

Scenario: CONTROLLER widget is created 
    Given a new widget is created 
    Then I should be on the widgets page 

यह बहुत की तरह कोड उत्पन्न होगा: यहाँ एक उदाहरण है

#FROM SCENARIO 1 
class Widget < ActiveRecord::Base 
    has_many :wadgets 
    belongs_to :manufacturer 
    validates_presence_of :quantity 
    accepts_nested_attributes_for :wadgets 
end 

#FROM SCENARIO 1  
class CreateWidget < ActiveRecord::Migration 
    def self.up 
    create_table :widgets do |t| 
     t.integer :quantity, :null=>false 
     t.integer :manufacturer_id 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :widgets 
    end 
end 

#FROM SCENARIO 2 
#new.html.haml (using formtastic helpers) 
=semantic_form_for(@widget) do |f| 
    = f.inputs do 
    = f.input :quantity 
    = f.semantic_fields_for :wadgets do |wadget| 
     = location.input :name 
    = f.buttons 
    =f.commit_button "Save Widget" 

#FROM SCENARIO 3 (using inherited resources) 
class WidgetsController < InheritedResources::Base 
    def create 
    create!{ widget_urls } 
    end 
end 

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

क्या कोई प्लगइन है जो इस तरह के परीक्षण & पीढ़ी कॉम्बो जैसा दिखता है?

और धन्यवाद अगर आपने इसे पढ़ने के लिए समय निकाला .. मुझे पता है कि यह थोड़ा लंबा था।

+0

मुझे लगता है कि यह काफी एक दिलचस्प विचार है, मैं इसे टोह रागेल – scaney

+0

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

+0

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

उत्तर

2

मुझे लगता है कि यहां ककड़ी का उपयोग ऐसा नहीं था जैसा कि इसका इरादा था।

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

मॉडल के व्यवहार और व्यापार तर्क के साथ बातचीत करने के लिए, आप आरएसपीसी या टेस्ट :: यूनिट का उपयोग करना बेहतर होगा - परीक्षण लिखना और मजाक करना/स्टबिंग करना बहुत आसान है। मुझे यकीन है कि ऐसे प्लगइन हैं जो आपके मॉडल में प्रत्येक फ़ील्ड/रिलेशनशिप के लिए आरएसपीसी परीक्षण उत्पन्न करते हैं। आरएसपीसी-रेल जेनरेटर आपके लिए पहले से ही अधिकांश काम करते हैं, उदा। rails generate rspec:scaffold Post

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

+0

मुझे आपको पसंद है, ऐसी कोई प्लगइन नहीं है, और स्पष्ट रूप से यह अच्छा विचार नहीं है, कोर रेल सुविधाओं का परीक्षण केवल तभी दिखाना चाहिए जब यह कुछ विशेष मामलों की तरह वास्तव में महत्वपूर्ण हो। आवेदन के हर मूल भाग के लिए परीक्षण परीक्षण का मतलब बहुत प्रयास है जो बेकार है - इससे अधिक समस्याएं होती हैं और फिर चीजों को हल करती है। ऐसे परीक्षण लिखना मॉडल/नियंत्रकों/विचारों से दूसरे शब्दों में कोड दोहराएगा, किसी में कोई भी बदलाव दूसरे, डुप्लीकेट या यहां तक ​​कि तीन बार प्रयासों में बदलाव को मजबूर करेगा। – mpapis

3

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

मुझे यह काम करने के बाद, मैं डीएसएल के आधार पर फीचर फाइलें बनाने के लिए जेनरेटर में हुकिंग करने की सोच रहा था।

application :test do 
    model :survey do 
    attribute :name, :string 
    has_many :questions 
    end 
    model :question do 
    has_many :options 
    has_many :answers 
    belongs_to :survey 
    attribute :body, :string 
    end 
    model :option do 
    belongs_to :question 
    attribute :body, :string 
    attribute :selector, :string 

    end 
    model :result do 
    belongs_to :survey 
    has_many :answers 
    end 
    model :answer do 
    belongs_to :result 
    belongs_to :question 
    attribute :value, :string 
    end 
    gen 
end 

और निम्न उत्पादन प्रिंट:

मैं एक कील चल रहा है जो निम्न इनपुट लेता है

rails new test 
cd test 
rails generate model survey name:string 
rails generate model question survey_id:integer body:string 
rails generate model option question_id:integer body:string selector:string 
rails generate model result survey_id:integer 
rails generate model answer result_id:integer question_id:integer value:string 
Updating class: Survey 
    has_many:questions 
Updating class: Question 
    belongs_to:survey 
    has_many:options 
    has_many:answers 
Updating class: Option 
    belongs_to:question 
Updating class: Result 
    belongs_to:survey 
    has_many:answers 
Updating class: Answer 
    belongs_to:result 
    belongs_to:question 

स्टीव

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