8

明らかに、私はレールにまったく慣れていないので、私に固執してください。

モデルにコンストラクターを追加しました

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

初期化が行われる前にうまく機能しました。パラメータを「new」メソッドに渡す必要がありますが、これは、ユーザーから引数を渡して保存するためにビューが開かれた後に行われました。エラーが発生したため、そのビューを開くことができません

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

そのコンストラクターがないと、すべてのテストが失敗します....

4

1 に答える 1

13

ActiveModelによって提供されるデフォルトのコンストラクターはかなり良いです。作成したコンストラクターを削除すると、次のようなデフォルトのコンストラクターを使用できるようになります。

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

new(アクションのように)3つの引数を提供したくない場合は、@movie = Movie.new

于 2013-02-09T19:50:06.463 に答える