2013-02-09 10 views
5

स्पष्ट रूप से मैं रेल के लिए काफी नया हूं, इसलिए मेरे साथ रहें।रेल 'पैरा' पैरामीटर को 'नई' विधि

मैं अपने मॉडल

class Movie < Media 
    attr_accessible :director, :studio 
    attr_accessor :director, :studio 

    validates_presence_of :director, :studio, :title 
    def initialize title, director, studio 
    @title = title 
    @director = director 
    @studio = studio 
    end 
end 

और मेरे लिए चीजें गड़बड़ की इस प्रकार की करने के लिए एक निर्माता जोड़ दिया है। 'नए' इस

def new 
    @movies = Movie.new 
end 

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

wrong number of arguments (0 for 3) 

निर्माता जोड़ दिया गया मिलता है। इसे हल करने पर सुझाव?

संपादित करें: मेरे परीक्षण इस तरह दिखेगा:

require 'spec_helper' 

describe Movie do 

    before :each do 
     @movie = Movie.new "Bullet", "John", "20th" 
    end 
    describe "#{new}" do 
     it "returns new object of Movie" do 
      @movie.should be_an_instance_of Movie 
     end 
     it "throws ArgumentError when give less than 3 parameters" do 
      lambda {Movie.new(:director => "John", :studio => "20th")}.should raise_exception ArgumentError 
     end 
    end 

    describe "#title" do 
     it "returns the correct title" do 
      @movie.title.should eql "Bullet" 
     end 
    end 
    describe "#director" do 
     it "returns the correct director" do 
      @movie.director.should eql "John" 
     end 
    end 
    describe "#studio" do 
     it "returns the correct studio" do 
      @movie.studio.should eql "20th" 
     end 
    end 
end 
कि निर्माता सभी परीक्षणों असफल बिना

....

+0

सुझाव: यदि आपको केवल परीक्षण के लिए डिफ़ॉल्ट सेट करने की आवश्यकता है, तो परीक्षण के लिए एक कारखाने का उपयोग करें जो डिफ़ॉल्ट सेट करने के तरीके प्रदान करता है और इसे आपके एप्लिकेशन कोड में खून नहीं करता है। यदि आपको अन्य कारणों से ऐसा करने की ज़रूरत है, [इस प्रश्न को देखें] (http://stackoverflow.com/questions/328525/what-is-the-best-way-to-set-default-values-in-activerecord) – numbers1311407

+0

मैं अपने परीक्षणों में सिद्ध तर्क देता हूं। समस्या नहीं है। टेस्ट जांच कर रहा था कि क्या 3 से कम तर्क साबित हुए हैं, ऐसा करने के लिए इसे कन्स्ट्रक्टर जोड़ना था, ऐसा करने से ऐसा समस्या हुई। –

+0

ठीक है, नया सुझाव: किसी भी कारण से कोर सक्रिय_रेकॉर्ड कार्यक्षमता को तोड़ने वाले परीक्षणों को न लिखें, जिससे आप उन्हें ठीक करने के लिए व्यापक रूप से प्रयुक्त रेल घटकों को कोड काउंटर लिखने के लिए मजबूर कर सकें। 'ActiveRecord :: बेस # प्रारंभिक 'पैरामीटर ऑब्जेक्ट स्वीकार करता है, न कि तर्कों की सूची। यदि आप सक्रिय_रेकॉर्ड के ऐसे प्राथमिक टुकड़े को तोड़ने का आग्रह करते हैं तो यह आपके लिए कई समस्याओं में से पहला होगा। – numbers1311407

उत्तर

8

डिफ़ॉल्ट ActiveModel द्वारा प्रदान की निर्माता काफ़ी अच्छी है।

@movie = Movie.new(title: 'The Hobbit', director: 'Peter Jackson', studio: 'New Line Cinema') 

आप (अपने new कार्रवाई में) की तरह तीन तर्कों प्रदान करने के लिए नहीं करना चाहते हैं, तो आप के साथ छड़ी कर सकते हैं: आप निर्माता आप ने लिखा हटाते हैं, तो आप इस तरह डिफ़ॉल्ट निर्माता का उपयोग करने में सक्षम होना चाहिए @movie = Movie.new

+0

इसके अलावा, इस तरह की चीज़ों के साथ बेहतर होने के लिए वास्तव में एक अच्छा संसाधन है [लाश के लिए रेल] (http://railsforzombies.org/) – graysonwright

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