ruby-on-rails - 具有嵌套路由的 api 规范失败

标签 ruby-on-rails ruby api routes nested-routes

我正在努力将 api 添加到 ruby​​ on rails 待办事项列表项目作为学习练习,但我在测试一些使用嵌套路由的规范时遇到了问题。

我想在使用/lists/1/端点时显示未完成任务的列表,但是当我运行我的规范时,出现 UrlGenerationErrors 并且没有路由匹配。

关于如何解决这个问题有什么想法吗?是不是routes.rb有误?

仅供引用,我确实有响应/user/1/lists 和/lists/的索引,因此我还可以显示用户拥有哪些列表以及应用程序中存在哪些公共(public)列表。这就是让应用程序感到困惑的原因吗?

谢谢!

规范

  describe "#show" do
    ...

    context "authorized user is the owner of the list" do
      it "returns all uncompleted items" do
        params = {list_id: @personal_list.id}
        get :show, params

        expect(response.status).to eq(200) 
        #expect(json).to json
      end
    end

    context "authorized user when looking at a nonprivate list" do
      it "returns all uncompleted items" do
        params = {list_id: @open_list.id}
        get :show, params

        expect(response.status).to eq(200)
        #expect(json).to json
      end
    end   

    context "authorized user when looking at a private list" do
      it "returns error" do
        authWithToken(@api.access_token)
        params = {list_id: @private_list.id}
        get :show, params

        expect(response.status).to eq(400) 
      end
    end
  end 

Failure Messages

:V1::ListsController#show authorized user is the owner of the list returns all uncompleted items
     Failure/Error: get :show, params
     ActionController::UrlGenerationError:
       No route matches {:list_id=>"1", :controller=>"api/v1/lists", :action=>"show"}
     # ./spec/controllers/api/v1/lists_controller_spec.rb:109:in `block (4 levels) in <top (required)>'

  2) Api::V1::ListsController#show authorized user when looking at a nonprivate list returns all uncompleted items
     Failure/Error: get :show, params
     ActionController::UrlGenerationError:
       No route matches {:list_id=>"2", :controller=>"api/v1/lists", :action=>"show"}
     # ./spec/controllers/api/v1/lists_controller_spec.rb:126:in `block (4 levels) in <top (required)>'

  3) Api::V1::ListsController#show authorized user when looking at a private list returns error
     Failure/Error: get :show, params
     ActionController::UrlGenerationError:
       No route matches {:list_id=>"3", :controller=>"api/v1/lists", :action=>"show"}
     # ./spec/controllers/api/v1/lists_controller_spec.rb:143:in `block (4 levels) in <top (required)>'

路线

namespace :api, defaults: {format: 'json'} do
    namespace :v1 do
      resources :users, except: [:destroy, :new] do 
        resources :lists, only: [:index]
      end

      resources :lists, only: [:index, :show, :create, :update, :destroy] do
        resources :items, only: [:create, :update, :destroy]
      end

      resources :items, only: [:destroy]
    end
  end

       Prefix Verb   URI Pattern                                Controller#Action
api_v1_user_lists GET    /api/v1/users/:user_id/lists(.:format)     api/v1/lists#index {:format=>"json"}
     api_v1_users GET    /api/v1/users(.:format)                    api/v1/users#index {:format=>"json"}
                  POST   /api/v1/users(.:format)                    api/v1/users#create {:format=>"json"}
 edit_api_v1_user GET    /api/v1/users/:id/edit(.:format)           api/v1/users#edit {:format=>"json"}
      api_v1_user GET    /api/v1/users/:id(.:format)                api/v1/users#show {:format=>"json"}
                  PATCH  /api/v1/users/:id(.:format)                api/v1/users#update {:format=>"json"}
                  PUT    /api/v1/users/:id(.:format)                api/v1/users#update {:format=>"json"}
api_v1_list_items POST   /api/v1/lists/:list_id/items(.:format)     api/v1/items#create {:format=>"json"}
 api_v1_list_item PATCH  /api/v1/lists/:list_id/items/:id(.:format) api/v1/items#update {:format=>"json"}
                  PUT    /api/v1/lists/:list_id/items/:id(.:format) api/v1/items#update {:format=>"json"}
                  DELETE /api/v1/lists/:list_id/items/:id(.:format) api/v1/items#destroy {:format=>"json"}
     api_v1_lists GET    /api/v1/lists(.:format)                    api/v1/lists#index {:format=>"json"}
                  POST   /api/v1/lists(.:format)                    api/v1/lists#create {:format=>"json"}
      api_v1_list GET    /api/v1/lists/:id(.:format)                api/v1/lists#show {:format=>"json"}
                  PATCH  /api/v1/lists/:id(.:format)                api/v1/lists#update {:format=>"json"}
                  PUT    /api/v1/lists/:id(.:format)                api/v1/lists#update {:format=>"json"}
                  DELETE /api/v1/lists/:id(.:format)                api/v1/lists#destroy {:format=>"json"}
      api_v1_item DELETE /api/v1/items/:id(.:format)                api/v1/items#destroy {:format=>"json"}

列出 API Controller

  def show
    @list = List.find(params[:id])
    if (@list.permissions == "open") || (@list.user_id == @authorized_user)
      render json: @list.items.completed, each_serializer: ItemSerializer
    else
      render json: @list.errors, status: :error
    end
  end

最佳答案

看起来问题在于您发送的是 list_id 参数而不是 id。

#show 的默认 rails 路由查找一个 :id,这也是您在 Controller 中(正确)使用的。

尝试按如下方式重写您的测试:

describe "#show" do
...
  context "authorized user is the owner of the list" do
    it "returns all uncompleted items" do
      get :show, :id => @personal_list.id
  end

OR

  context "authorized user is the owner of the list" do
    it "returns all uncompleted items" do
      params = {id: @private_list.id}
      get :show, params
  end
...
end 

要确保的另一件事是您使用的是正确的顶级描述。因为这是 Controller 规范,所以需要与 Controller 名称相匹配。即:

describe Api::V1::ListsController do
  describe 'show' do

关于ruby-on-rails - 具有嵌套路由的 api 规范失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26418675/

相关文章:

ruby-on-rails - 将 devise_token_auth 与表单例份验证一起使用

php - 在没有设置 Laravel 数据库时返回插入 ID

ruby-on-rails - 返回自身的 Ruby 方法

javascript - devise token auth - 如何使用javascript访问响应头信息?

ruby - Watir - 使用部分文本查找元素

rest - 如何为 YAML 对象中的几个键设置一个值

Android SDK 推特客户端

ruby-on-rails - Rails : gem. config & rake gems:install -- 没有要加载的文件

javascript - 日期选择器 Bootstrap 不保存

ruby-on-rails - Rails 设计自定义邮件程序