【问题标题】:Rails routes and rspec testing errorsRails 路由和 rspec 测试错误
【发布时间】:2011-12-14 20:17:18
【问题描述】:

我正在建立一个博客。我想将帖子与用户相关联。我有这样的路线设置:

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"}

我知道使用这些路由一切正常,但它们错了,我需要以其他方式路由它们吗?或者我可以在测试中改变什么以使它们通过?

谢谢。

【问题讨论】:

    标签: testing rspec routes


    【解决方案1】:

    get 'edit' =&gt; No route matches {:controller=&gt;"posts", :action=&gt;"edit"}

    失败,因为路由在参数中需要:user_id。你想要:

    get 'edit', :user_id =&gt; 1

    顺便说一句,您似乎正在用您的 match 语句覆盖“资源丰富”的路线,例如:

    match '/users/:user_id/posts/new', :to =&gt; 'posts#create'

    覆盖resources 语句创建的new_user_post 路由。你确定那是故意的吗?您通常希望 /users/:user_id/posts/new 转到 new 操作(呈现表单)而不是 create 操作(处理已发布的表单)。

    【讨论】:

    • 是的,我知道,我正在覆盖它们,但我很高兴我的动作以某种方式起作用了哈......但在我有这些路线之前,编辑、更新等不会工作,会给我上面提到的错误:No route matches "/users/1/posts/15/edit" No route matches "/users/1/posts/new"...你知道如果我把这些路线拿出来我必须做什么才能让它工作吗?我需要修复这些错误的正确路线是什么?
    • 你已经非常接近让它工作了。我建议查看 Rails 路由指南以完整解释资源丰富的路线——这应该会让你走上正确的轨道:guides.rubyonrails.org/routing.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多