Rails маршруты и ошибки тестирования rspec - PullRequest
1 голос
/ 15 декабря 2011

Я строю блог.Я хочу связать сообщения с пользователями.У меня есть настройки маршрутов следующим образом:

resources :users do
 resources :posts
end

resources :sessions, :only => [:new, :create, :destroy]

match '/signup', :to => 'users#new' 
match '/login',  :to => 'sessions#new'
match '/logout', :to => 'sessions#destroy' 

root :to => "pages#home"

Это связывает сообщения с пользователями, и когда я делаю rake routes, это выглядит так:

user_posts GET    /users/:user_id/posts(.:format)          {:action=>"index", :controller=>"posts"}
user_posts POST   /users/:user_id/posts(.:format)          {:action=>"create", :controller=>"posts"}
new_user_post GET    /users/:user_id/posts/new(.:format)      {:action=>"new", :controller=>"posts"}
edit_user_post GET    /users/:user_id/posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"}
 user_post GET    /users/:user_id/posts/:id(.:format)      {:action=>"show", :controller=>"posts"}
 user_post PUT    /users/:user_id/posts/:id(.:format)      {:action=>"update", :controller=>"posts"}
 user_post DELETE /users/:user_id/posts/:id(.:format)      {:action=>"destroy", :controller=>"posts"}
     users GET    /users(.:format)                         {:action=>"index", :controller=>"users"}
     users POST   /users(.:format)                         {:action=>"create", :controller=>"users"}
  new_user GET    /users/new(.:format)                     {:action=>"new", :controller=>"users"}
 edit_user GET    /users/:id/edit(.:format)                {:action=>"edit", :controller=>"users"}
      user GET    /users/:id(.:format)                     {:action=>"show", :controller=>"users"}
      user PUT    /users/:id(.:format)                     {:action=>"update", :controller=>"users"}
      user DELETE /users/:id(.:format)                     {:action=>"destroy", :controller=>"users"}
    sessions POST   /sessions(.:format)                      {:action=>"create", :controller=>"sessions"}
 new_session GET    /sessions/new(.:format)                  {:action=>"new", :controller=>"sessions"}
     session DELETE /sessions/:id(.:format)                  {:action=>"destroy", :controller=>"sessions"}
                  /users/:user_id/posts/new(.:format)      {:controller=>"posts", :action=>"create"}
                  /users/:user_id/posts/:id/edit(.:format) {:controller=>"posts", :action=>"update"}
                  /users/:user_id/posts/:id(.:format)      {:controller=>"posts", :action=>"destroy"}
    signup        /signup(.:format)                        {:controller=>"users", :action=>"new"}
     login        /login(.:format)                         {:controller=>"sessions", :action=>"new"}
    logout        /logout(.:format)                        {:controller=>"sessions", :action=>"destroy"}
      root        /(.:format)                              {:controller=>"pages", :action=>"home"}

До того, как я сделал какие-либо другие изменения вмаршруты, я бы тогда попытался создать новые сообщения, редактировать и обновлять их.Но когда я пытался создавать, редактировать или обновлять сообщения, я получал ошибки:

No route matches "/users/1/posts/15/edit"
No route matches "/users/1/posts/new"

Итак, я поиграл и добавил это к своим маршрутам:

match '/users/:user_id/posts/new', :to => 'posts#create'
match '/users/:user_id/posts/:id/edit', :to => 'posts#update'
match '/users/:user_id/posts/:id', :to => 'posts#destroy'

После этоговсе работало.Обновление, создание, редактирование и т. Д. Но некоторые из моих тестов провалились.

1) PostsController GET 'new' returns http success
 Failure/Error: get 'posts#new'
 ActionController::RoutingError:
   No route matches {:controller=>"posts", :action=>"posts#new"}
 # ./spec/controllers/posts_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

2) PostsController GET 'edit' returns http success
 Failure/Error: get 'edit'
 ActionController::RoutingError:
   No route matches {:controller=>"posts", :action=>"edit"}

Я знаю, что с использованием этих маршрутов все работало, но они ошибочны, и мне нужно направить их другим способом?Или я могу что-то изменить в тестах, чтобы они прошли?

Спасибо.

1 Ответ

2 голосов
/ 15 декабря 2011

get 'edit' => No route matches {:controller=>"posts", :action=>"edit"}

терпит неудачу, потому что для маршрута требуется :user_id в параметрах.Вы хотите:

get 'edit', :user_id => 1

кстати, кажется, что вы переопределяете «находчивые» маршруты с помощью своих операторов match, например:

match '/users/:user_id/posts/new', :to => 'posts#create'

переопределяет маршрут new_user_post, созданный оператором resources.Вы уверены, что это то, что было задумано?Как правило, вы хотите, чтобы /users/:user_id/posts/new переходил к действию new (отображение формы), а не к действию create (обработка опубликованной формы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...