2016-10-07 54 views
1

我試圖在一個非足智多謀的路由的RSpec測試中將ID傳遞給get方法,並且我得到一個參數錯誤。傳遞RSpec的參數錯誤獲取方法的一個參數

這裏的測試:在MoviesController

describe MoviesController do 
    describe "search directors" do 
    it 'calls the model method that find similar movies' do 
     movie1 = Movie.create(:title => "Star Wars1", :director => "George", :rating => "R") 
     movie2 = Movie.create(:title => "Star Wars2", :director => "George", :rating => "R") 
     get :search_directors, {:id => 1} 
    end 
    end 
end 

search_directions行動:

def search_directors 
    @movie = Movie.find(params[:id]) 
    @movies = Movie.similar_movies(@movie) 
    end 

這裏是我的路線:

Rottenpotatoes::Application.routes.draw do 
    resources :movies 
    root :to => redirect('/movies') 
    get '/movies/search_directors/:id', to:'movies#search_directors' 
end 

電影模式(movie.rb)

class Movie < ActiveRecord::Base 
    def self.all_ratings 
    %w(G PG PG-13 NC-17 R) 
    end 
    def self.similar_movies 
    Movie.where(director: self.director) 
    end 
end 

和錯誤:

Failure/Error: get 'search_directors', {:id => 1} 
ArgumentError: 
    wrong number of arguments (given 1, expected 0) 
# ./app/models/movie.rb:5:in `similar_movies' 
# ./app/controllers/movies_controller.rb:66:in `search_directors' 
# /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
# /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/abstract_controller/base.rb:198:in `process_action' 
# /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_controller/metal/rendering.rb:10:in `process_action' 
# /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
+0

你確定錯誤不在你的'search_directors'方法中嗎?您能否包含錯誤附帶的完整跟蹤? – SteveTurczyn

+0

你說得對,它是search_directors發生錯誤的地方,我更新了帖子以反映這一點。 – m3funkyb

+0

太好了,你可以發佈你的movie.rb嗎?第5行是問題。 – SteveTurczyn

回答

0

是的,問題是在這裏...

def self.similar_movies 
    Movie.where(director: self.director) 
    end 

有沒有類方法director和你不解決這個問題的一個方法傳遞一個實例。 ...

def self.similar_movies(movie) 
    Movie.where(director: movie.director) 
    end 

但更好的辦法是讓一個實例方法....

def similar_movies 
    Movie.where(director: self.director) 
    end 

然後你就可以代替...

@movies = Movie.similar_movies(@movie) 

與好得多......

@movies = @movie.similar_movies 

你甚至都不需要在控制器中search_directors方法,只是參考(在你的看法)@movie.similar_movies

進一步建議的改進......在similar_movies你可能不想包括self返回集合中(主要的電影不應該在類似的電影列表中顯示出來),所以:

def similar_movies 
    Movie.where(director: director).where.not(id: id) 
    end 

注(的方式)使用director是好的,你不需要self.director。做任務時你只需要self

# creates a local variable 
director = "Alfred" 
# updates the model attribute 
self.director = "Alfred" 
+0

非常好,這是一個非常明確的解釋,並且幫助我明顯地理解,已經upvoted,但我的聲譽太低,它顯示了呢!再次感謝史蒂夫。 – m3funkyb

+0

很高興能幫到你!你可以接受與投票一樣好的答案:)接受答案的選項應該在答案的左邊。 – SteveTurczyn