如何处理路线之间的矛盾?

时间:2017-11-19 08:09:31

标签: ruby-on-rails ruby rspec

我的路线档案:

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

由于

1 个答案:

答案 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

这个解决方案有效,但我希望有另一种解决方法。