Ruby Cucumber говорит, что путь не может найти маршрут, когда Rake Routes показывают, что он есть - PullRequest
1 голос
/ 22 марта 2012

У меня есть Ruby on Rails с огурцом. БД была перенесена в тестовую среду, и я вижу это с помощью sqliteman. Проблема в том, что в то время как Rake Routes показывает маршруты, которые я хочу, огурец возвращает ошибку о том, что маршруты не существуют.

Маршруты:

    movies GET    /movies(.:format)          {:action=>"index", :controller=>"movies"}
           POST   /movies(.:format)          {:action=>"create", :controller=>"movies"}
 new_movie GET    /movies/new(.:format)      {:action=>"new", :controller=>"movies"}
edit_movie GET    /movies/:id/edit(.:format) {:action=>"edit", :controller=>"movies"}
     movie GET    /movies/:id(.:format)      {:action=>"show", :controller=>"movies"}
           PUT    /movies/:id(.:format)      {:action=>"update", :controller=>"movies"}
           DELETE /movies/:id(.:format)      {:action=>"destroy", :controller=>"movies"}

Затем в том же окне подсказки я запускаю «bundle exec cucumber» и получаю эту ошибку в двух разных сценариях в одном и том же файле функций:

No route matches {:action=>"show", :controller=>"movies"} (ActionController::RoutingError)
No route matches {:action=>"edit", :controller=>"movies"} (ActionController::RoutingError)

Файл features / support / paths.rb завершается с ошибкой в ​​двух строках, где * movie_path * и * edit_movie_path * называются

when /^the details page for (.*)/
  mov= Movie.find_by_title($1)
  movie_path(mov)
when /^the edit page for (.*)/
  mov= Movie.find_by_title($1)
  edit_movie_path(mov)

Должен ли я каким-то образом прокладывать маршруты в тестовой среде? Я не уверен, что мне не хватает, так как «выглядит», как будто все кусочки есть.

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Это будет работать так:

when /the edit page for "(.*)"/
    movie= Movie.find_by_title($1)
    edit_movie_path(movie)

Но вы также можете использовать это:

   when /the edit page/
        edit_movie_path(Movie.first)
1 голос
/ 22 марта 2012

Я подозреваю, что Movie.find_by_title($1) не находит ничего, как вы ожидаете, в то время как mov означает nil, и, следовательно, он не может найти маршрут к нему, так как нет идентификатора.

Вы можете сделать это более очевидным, добавив ! к find_by_title, чтобы возникло исключение, когда ничего не было найдено:

when /^the details page for (.*)$/
  movie = Movie.find_by_title!($1)
  edit_movie_path(mov)
end
0 голосов
/ 22 марта 2012
edit_movie GET    /movies/:id/edit(.:format) {:action=>"edit", :controller=>"movies"}

{:action=>"edit", :controller=>"movies"} здесь относится к controller и action, связанным с этим маршрутом. Но вам потребуется параметр :id, чтобы правильно создать путь к этому маршруту.

No route matches {:action=>"show", :controller=>"movies"}

{:action=>"edit", :controller=>"movies"} здесь относится к параметрам, указанным при попытке создать путь для маршрута.

Я хотел бы убедиться, что ваш mov не ноль и возвращает правильную Movie запись.

...