2013-02-09 35 views
5

rõ ràng là tôi khá mới mẻ đối với đường ray, vì vậy hãy gắn bó với tôi.đường ray chuyển các tham số sang phương thức 'mới'

Tôi đã thêm một constructor để mô hình của tôi

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 

và loại sai lầm thứ cho tôi. Befor Tôi đã có một phương pháp 'mới' trong bộ điều khiển của tôi như thế này

def new 
    @movies = Movie.new 
end 

và nó làm việc độc đáo trước khi khởi tạo đến cùng. Nó đòi hỏi các tham số phải được chuyển tới phương thức 'mới', nhưng điều đó đã được thực hiện sau khi một khung nhìn được mở để truyền các đối số từ một người dùng và lưu chúng. Bây giờ tôi không thể mở điểm cho rằng vì tôi nhận được một lỗi

wrong number of arguments (0 for 3) 

Các nhà xây dựng đã được bổ sung do thực tế tôi bắt đầu ghi chép lại bài kiểm tra cho ứng dụng của tôi và thiết lập vaules mặc định cho các nhà xây dựng sẽ vô hiệu hóa bài kiểm tra đó. Đề xuất giải quyết vấn đề này?

EDIT: xét nghiệm của tôi trông như thế này:

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 

Nếu không có constructor rằng tất cả các cuộc thử nghiệm thất bại ....

+0

Đề xuất: Nếu bạn chỉ cần đặt giá trị mặc định để thử nghiệm, hãy sử dụng nhà máy để thử nghiệm cung cấp các cách đặt mặc định và không làm chảy máu mã này vào mã ứng dụng của bạn. Nếu bạn cần làm điều này vì các lý do khác, [xem câu hỏi này] (http://stackoverflow.com/questions/328525/what-is-the-best-way-to-set-default-values-in-activerecord) – numbers1311407

+0

Tôi làm các đối số được minh chứng trong các bài kiểm tra của mình. Không phải vấn đề. Kiểm tra đã được kiểm tra nếu có ít hơn 3 đối số được chứng minh, để làm điều đó đã phải thêm các nhà xây dựng, bằng cách làm như vậy vấn đề này xảy ra. –

+0

Ok, đề xuất mới: Không viết các bài kiểm tra phá vỡ chức năng active_record cốt lõi vì không có lý do gì, buộc bạn phải viết mã truy cập vào các thành phần đường ray được sử dụng rộng rãi để khắc phục chúng. 'ActiveRecord :: Base # initialize' chấp nhận một đối tượng tham số, không phải là một danh sách các đối số. Nếu bạn nhấn mạnh vào việc phá vỡ một phần chính của active_record thì đây sẽ là vấn đề đầu tiên của bạn. – numbers1311407

Trả lời

8

Các constructor mặc định được cung cấp bởi ActiveModel là khá tốt. Nếu bạn xóa constructor mình viết, bạn sẽ có thể sử dụng constructor mặc định như thế này:

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

Khi bạn không muốn cung cấp ba đối số (như trong hành động new của bạn), bạn có thể gắn bó với @movie = Movie.new

+0

Ngoài ra, một nguồn lực thực sự tốt để có được tốt hơn với loại điều này là [Rails for Zombies] (http://railsforzombies.org/) – graysonwright

Các vấn đề liên quan