我的路线档案:
resources :users do
...
resources :subscriptions do
post 'add', on: :collection
put 'pause', on: :member
put 'cancel', on: :member
put 'resume', on: :member
put 'update', on: :member
end
...
end
当我尝试使用rspec测试 GET 对:show
订阅的请求时,它给了我
ActionController::RoutingError:
No route matches [GET] "/api/v1/users/1774/subscriptions/257/update"
我注意到它会自动将/update
附加到其末尾。
这是我的考验:
describe "GET /api_v1/subscriptions/:id" do
it "get subscription details" do
get api_v1_user_subscription_path(@user1.id,@subscription1.id), headers: admin_headers
expect(response).to be_success
expect(response.content_type).to eq("application/json")
end
end
这是我的rake routes
订阅:
add_api_v1_user_subscriptions POST /api/v1/users/:user_id/subscriptions/add(.:format) api/v1/subscriptions#add
pause_api_v1_user_subscription PUT /api/v1/users/:user_id/subscriptions/:id/pause(.:format) api/v1/subscriptions#pause
cancel_api_v1_user_subscription PUT /api/v1/users/:user_id/subscriptions/:id/cancel(.:format) api/v1/subscriptions#cancel
resume_api_v1_user_subscription PUT /api/v1/users/:user_id/subscriptions/:id/resume(.:format) api/v1/subscriptions#resume
api_v1_user_subscription PUT /api/v1/users/:user_id/subscriptions/:id/update(.:format) api/v1/subscriptions#update
api_v1_user_subscriptions GET /api/v1/users/:user_id/subscriptions(.:format) api/v1/subscriptions#index
POST /api/v1/users/:user_id/subscriptions(.:format) api/v1/subscriptions#create
GET /api/v1/users/:user_id/subscriptions/:id(.:format) api/v1/subscriptions#show
PATCH /api/v1/users/:user_id/subscriptions/:id(.:format) api/v1/subscriptions#update
PUT /api/v1/users/:user_id/subscriptions/:id(.:format) api/v1/subscriptions#update
DELETE /api/v1/users/:user_id/subscriptions/:id(.:format) api/v1/subscriptions#destroy
我注意到使用api_v1_user_subscription_path
是问题的根源,但我不明白它是如何产生问题的,尽管最后包含/update
的路线是put
并且我正在发送get
请求。
我有两个解决这个问题的方法:
1-更改订阅资源中update
路由的名称并且它有效
2-删除update
路由,因为resources :subscription
为我们制作但最后没有/update
。
问题是我的PM(项目经理)不接受这两种解决方案。
那么有没有人可以帮助我让路线无需接触put 'update', on: :member
?
由于
答案 0 :(得分:0)
这是一种让我的PM满意的方式:
#config/routes
resources :subscriptions do
post 'add', on: :collection
put 'pause', on: :member
put 'cancel', on: :member
put 'resume', on: :member
end
resources :subscriptions, only: [] do
put 'update', on: :member
end
这个解决方案有效,但我希望有另一种解决方法。