2013-02-09 15 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 。 'new'メソッドに渡すパラメータが必要ですが、ユーザーからの引数を渡して保存するビューを開いた後に実行されます。今、私はそのビューを開くことができない私は、エラー

wrong number of arguments (0 for 3) 

を得るため、コンストラクタが原因私は自分のアプリケーションのためのテストを足す開始し、コンストラクタのデフォルトvaulesを設定すると、そのテストが無効になります実際に追加されました。これを解決するための提案?

EDIT: 私のテストは次のようになります。すべてのテストが失敗したことがなければ、コンストラクタ

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

OK、新しい提案:コアのactive_record機能を何ら理由なく中断するテストを書いてはいけません。広く使われているレールコンポーネントのコードカウンタを修正して修正する必要があります。 'ActiveRecord :: Base#initialize'は引数のリストではなく、パラメータオブジェクトを受け入れます。あなたがactive_recordのようなプライマリの断片を壊すことを主張するなら、これはあなたのための多くの問題の最初になるでしょう。 – numbers1311407

答えて

8

ActiveModelが提供するデフォルトのコンストラクタはかなり良いです。あなたが書いたコンストラクタを削除した場合、あなたは次のようにデフォルトコンストラクタを使用することができるはずです。

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

あなたは(あなたのnewアクションのように)3つの引数を提供したくない場合は、あなたが固執することができます@movie = Movie.new

+0

また、この種のものでより良くなる本当に良いリソースは、[Rails for Zombies](http://railsforzombies.org/)です。 – graysonwright

関連する問題