【问题标题】:ActionController::UrlGenerationError: missing required keys: [:id]ActionController::UrlGenerationError:缺少必需的键:[:id]
【发布时间】:2014-07-08 00:49:49
【问题描述】:

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

 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

【问题讨论】:

    标签: ruby-on-rails-4 rspec capybara factory-bot rspec-rails


    【解决方案1】:

    它引发了一个错误,因为您还没有定义您想访问哪本书。缺少的键 id 是图书的 ID。所以你应该把它改成:

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

    注意,你可以直接传入 ID (book_path(book.id)),但如果你不这样做,Rails 会从传入的对象中推断出来。

    【讨论】:

    • 好的,我都通过了,并且 (book.id) 给了我一个不那么纠结的错误消息。使用 (book_path(book.id)),我得到:“没有路由匹配 {:action=>"show", :controller=>"books", :format=>nil, :id=>nil} 缺少必需的键: [:id]"
    • 你正在build这本书,所以它不会被分配一个ID(因为它还没有保存到数据库中)。将其更改为FactoryGirl.create(:book),您应该会很好。
    • 哦!好吧,我没有意识到使用 build 你不会得到一个 id,只是使用 create。已经解决了,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多