2014-07-08 111 views
1

我跑3 RSpec的測試和我得到同樣的錯誤這一個特定的路徑:的ActionController :: UrlGenerationError:缺少必需的鍵:[:ID]

Failure/Error: visit book_path 
ActionController::UrlGenerationError: 
No route matches {:action=>"show", :controller=>"books"} missing required keys: [:id] 

我的測試是沒有完全結束,所以我確信後面的一些代碼可能不正確。但我不能讓我的訪問路徑線運行:

... 
book = FactoryGirl.build(:book) 
reviews = FactoryGirl.build_list(:review, 5, book: book) 

visit book_path 

reviews.each do |review| 
    expect(page).to have_content(review.rating) 
    expect(page).to have_content(review.body) 
    expect(page).to have_content(review.timestamp) 
end 

    expect(page).to have_content('House of Leaves') 
    expect(page).to have_content('Mark Z. Danielewski') 
    expect(page).to have_content('Horror') 
end 

在我的控制,我有表演定義爲:

def show 
    @book = Book.find(params[:id]) 
    @reviews = @book.reviews.order('created_at DESC') 
    @review = Review.new 
end 

我的資源:

resources :books, only: [:index, :show, :new, :create] do 
    resources :reviews, only: [:show, :new, :create] do 
end 

回答

6

它提高由於您尚未定義哪本書想要訪問哪本書,因此出現錯誤。缺少的密鑰id是本書的ID。所以,你應該更改爲:

book = FactoryGirl.build(:book) 
reviews = FactoryGirl.build_list(:review, 5, book: book) 

visit book_path(book) 

注意,您可以在ID直接(book_path(book.id))通過,但如果你不這樣做Rails會從傳遞的對象來推斷。

+0

好的,我通過了和(book.id)給我一個較少糾結的錯誤消息。使用(book_path(book.id)),我得到:「沒有路由匹配{:action =>」show「,:controller =>」books「,:format => nil,:id => nil} [:id]「 – bonesjones

+2

你正在編寫這本書,所以它不會被分配一個ID(因爲它還沒有保存到數據庫中)。把它改成'FactoryGirl.create(:book)',你應該很好。 –

+1

哦!好吧,我沒有意識到,構建你不會得到一個ID,只是與創建。修復它,非常感謝你! – bonesjones

相關問題