我的路由文件:
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 测试订阅:show
的 GET 请求时,它给了我
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
的情况下工作?
谢谢
这是一种让我的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
这个解决方案有效,但我希望是否有另一种方法可以解决这个问题。