2013-02-09 4 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 

과 나를 위해 엉망이 물건의 종류에 생성자를 추가했습니다. 내가 방법을 했어 befor을이

def new 
    @movies = Movie.new 
end 

처럼 내 컨트롤러와 초기화가 나타나기 전에 잘했다 '새로운'. 매개 변수가 '새'메소드로 전달되어야하지만 사용자가 인수를 전달하고 저장하는보기가 열린 후에 완료해야합니다. 내가 오류를

wrong number of arguments (0 for 3) 

생성자가 추가되었습니다를 얻을 수 있기 때문에 지금은 때문에 내 응용 프로그램에 대한 테스트를을 writting 그 시험을 무효로합니다 생성자에 대한 기본 vaules 설정 시작 사실에 해당 뷰를 열 수 없습니다. 이것에 대한 제안?

편집 : 내 테스트는 다음과 같이 : ActiveModel에서 제공

모든 테스트가 실패하는 생성자없이
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

좋습니다, 새로운 제안 : 아무런 이유없이 핵심 active_record 기능을 깨뜨리는 테스트를 작성하지 마십시오. 널리 사용되는 레일 구성 요소의 코드 카운터를 수정해야합니다. 'ActiveRecord :: Base # initialize'는 인수 목록이 아닌 매개 변수 객체를 받아들입니다. 당신이 active_record와 같은 중요한 조각을 깨뜨리려고한다면, 이것은 당신을위한 많은 문제 중 첫 번째가 될 것입니다. – numbers1311407

답변

8

기본 생성자는 꽤 좋다. 당신이 (당신의 new 행동 같은) 세 개의 인수를 제공하지 않으려면

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

, 당신이 스틱 수 있습니다 : 당신은 당신이 쓴 생성자를 삭제하면,이 같은 기본 생성자를 사용할 수 있어야합니다 @movie = Movie.new

+0

또한, 이런 종류의 일로 더 나아질 수있는 정말 좋은 자료는 [Rails for Zombies] (http://railsforzombies.org/)입니다. – graysonwright

관련 문제