ActionController :: UrlGenerationError:缺少必需的键:[:id]

bon*_*nes 1 rspec capybara rspec-rails ruby-on-rails-4 factory-bot

我正在运行RSpec 3测试,并且在这个特定路径上遇到同样的错误:

 Failure/Error: visit book_path
 ActionController::UrlGenerationError:
 No route matches {:action=>"show", :controller=>"books"} missing required keys: [:id]
Run Code Online (Sandbox Code Playgroud)

我的测试还没完成,所以我确定后面的一些代码可能不正确.但我无法让我的访问路径行运行:

...
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
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我将show定义为:

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

我的资源:

resources :books, only: [:index, :show, :new, :create] do
  resources :reviews, only: [:show, :new, :create] do
end
Run Code Online (Sandbox Code Playgroud)

Jos*_*zel 6

它引发了一个错误,因为你还没有定义你想访问本书.缺少的密钥id是书的ID.所以你应该改为:

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

visit book_path(book)
Run Code Online (Sandbox Code Playgroud)

请注意,您可以直接传入ID(book_path(book.id)),但如果您不这样做,Rails将从传递的对象推断出它.

  • 你正在构建这本书,所以它不会被分配一个ID(因为它还没有保存到数据库中).把它改成`FactoryGirl.create(:book)`,你应该很好. (2认同)