2013-02-09 12 views
5

offensichtlich bin ich ziemlich neu zu Schienen, also bleib bei mir.Rails Pass-Parameter auf "neue" Methode

Ich habe einen Konstruktor mein Modell

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 

und diese Art von verkorksten Dingen für mich gegeben. Befor Ich habe eine Methode hatte ‚neuen‘ in meinem Controller wie diese

def new 
    @movies = Movie.new 
end 

und es funktionierte gut, bevor die initialize kam. Es erfordert Parameter, die an die "neue" Methode übergeben werden, aber das wurde getan, nachdem eine Ansicht geöffnet wurde, um Argumente von einem Benutzer zu übergeben und sie zu speichern. Jetzt kann ich diese Ansicht nicht öffnen, weil ich einen Fehler

wrong number of arguments (0 for 3) 

Der Konstruktor erhalten wurde aufgrund der Tatsache, habe ich writting Test für meine Anwendung gestartet und das Standard-Werte annehmen für den Konstruktor Einstellung wird diesen Test zunichte machen. Vorschlag zur Lösung dieses Problems?

EDIT: Meine Tests wie folgt aussehen:

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 

Ohne diesen Konstruktor alle die Tests fehlschlagen ....

+0

Vorschlag: Wenn Sie nur Standardwerte für Tests festlegen müssen, verwenden Sie eine Factory für das Testen, die Möglichkeiten zum Festlegen von Standardwerten bietet und diese nicht in Ihren Anwendungscode einblendet. Wenn Sie dies aus anderen Gründen tun müssen, [siehe diese Frage] (http://stackoverflow.com/questions/328525/what-is-the-best-way-to-set-default-values-in-actrecord) – numbers1311407

+0

Ich habe Argumente in meinen Tests angegeben. Nicht das Problem. Test hat geprüft, ob es weniger als 3 Argumente gibt, dazu musste der Konstruktor hinzugefügt werden, wodurch dieses Problem auftrat. –

+0

Ok, neuer Vorschlag: Schreiben Sie keine Tests, die die Kernfunktion active_record ohne Grund brechen und Sie zwingen, Codezähler zu weit verbreiteten Rails-Komponenten zu schreiben, um sie zu reparieren. 'ActiveRecord :: Base # initialize' akzeptiert ein Parameterobjekt, keine Liste von Argumenten. Wenn Sie darauf bestehen, einen solchen primären Teil von active_record zu brechen, dann wird dies das erste von vielen Problemen für Sie sein. – numbers1311407

Antwort

8

Der Standardkonstruktor von ActiveModel vorgesehen ist ziemlich gut. Wenn Sie den Konstruktor löschen Sie geschrieben haben, sollten Sie in der Lage sein, den Standard-Konstruktor wie folgt zu verwenden:

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

Wenn Sie nicht über die drei Argumente zur Verfügung stellen möchten (wie in Ihrem new Aktion), können Sie halten mit

+0

Auch eine wirklich gute Ressource, um mit dieser Art von Sache besser zu werden, ist [Rails for Zombies] (http://railsforzombies.org/) – graysonwright

Verwandte Themen