如何处理路线之间的矛盾



我的路由文件:

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 测试订阅:showGET 请求时,它给了我

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

这个解决方案有效,但我希望是否有另一种方法可以解决这个问题。

最新更新