kurenn / market_place_api

The API on Rails tutorial application
142 stars 70 forks source link

Unable to access api endpoint (via cURL and in browser) #73

Closed msuzoagu closed 8 years ago

msuzoagu commented 8 years ago

Hello Everyone!

I am hoping someone can help me figure out what I am doing wrong/don't understand.

Reading APIs on Rails and working through the examples. Now at the point where I get to test api endpoints via Curl (chapt 3) and, although my tests pass, I keep getting the error:

{
  "status":404,"error":"Not Found","exception":"#\u003cActionController::RoutingError: 
  No route matches [GET] \"/continents/1\"\u003e","traces":
  {"Application Trace":[],"Framework Trace": [{"id":0,"trace":"actionpack (5.0.0.rc1)
   lib/action_dispatch/middleware/debug_exceptions.rb:53:in `call'"}, 
  {"id":1,"trace":"actionpack (5.0.0.rc1) 
  lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'"},
  {"id":2,"trace":"railties (5.0.0.rc1) lib/rails/rack/logger.rb:36:in `call_app'"},
  {"id":3,"trace":"railties (5.0.0.rc1) lib/rails/rack/logger.rb:24:in `block in call'"},
  {"id":4,"trace":"activesupport (5.0.0.rc1) lib/active_support/tagged_logging.rb:70:in 
  `block in tagged'"},
  {"id":5,"trace":"activesupport (5.0.0.rc1) lib/active_support/tagged_logging.rb:26:in 
  `tagged'"},
  {"id":6,"trace":"activesupport (5.0.0.rc1) lib/active_support/tagged_logging.rb:70:in 
  `tagged'"},{"id":7,"trace":"railties (5.0.0.rc1) lib/rails/rack/logger.rb:24:in `call'"}, 
  {"id":8,"trace":"actionpack (5.0.0.rc1) lib/action_dispatch/middleware/request_id.rb:24:in `call'"}, 
  {"id":9,"trace":"rack (2.0.0.rc1) lib/rack/runtime.rb:22:in `call'"},
  {"id":10,"trace":"activesupport (5.0.0.rc1)
  lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'"}, 
  {"id":11,"trace":"actionpack (5.0.0.rc1) lib/action_dispatch/middleware/executor.rb:12:in `call'"},
  {"id":12,"trace":"actionpack (5.0.0.rc1) lib/action_dispatch/middleware/static.rb:136:in `call'"},
  {"id":13,"trace":"rack (2.0.0.rc1) lib/rack/sendfile.rb:111:in `call'"},{"id":14,"trace":"railties (5.0.0.rc1)
  lib/rails/engine.rb:522:in `call'"},{"id":15,"trace":"rack (2.0.0.rc1) lib/rack/handler/webrick.rb:86:in 
  `service'"},{"id":16,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'"},
  {"id":17,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'"},
  {"id":18,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in
   start_thread'"}],"Full Trace":[{"id":0,"trace":"actionpack (5.0.0.rc1)
   lib/action_dispatch/middleware/debug_exceptions.rb:53:in `call'"},
  {"id":1,"trace":"actionpack (5.0.0.rc1) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'"},
  {"id":2,"trace":"railties (5.0.0.rc1) lib/rails/rack/logger.rb:36:in `call_app'"},{"id":3,"trace":"railties 
  (5.0.0.rc1) lib/rails/rack/logger.rb:24:in `block in call'"},{"id":4,"trace":"activesupport (5.0.0.rc1) 
  lib/active_support/tagged_logging.rb:70:in `block in tagged'"},{"id":5,"trace":"activesupport (5.0.0.rc1)  
  lib/active_support/tagged_logging.rb:26:in `tagged'"},{"id":6,"trace":"activesupport (5.0.0.rc1) 
  lib/active_support/tagged_logging.rb:70:in `tagged'"},{"id":7,"trace":"railties (5.0.0.rc1) 
  lib/rails/rack/logger.rb:24:in `call'"},{"id":8,"trace":"actionpack (5.0.0.rc1) 
  lib/action_dispatch/middleware/request_id.rb:24:in `call'"},{"id":9,"trace":"rack (2.0.0.rc1) 
  lib/rack/runtime.rb:22:in `call'"},{"id":10,"trace":"activesupport (5.0.0.rc1) 
  lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'"},{"id":11,"trace":"actionpack 
  (5.0.0.rc1) lib/action_dispatch/middleware/executor.rb:12:in `call'"},{"id":12,"trace":"actionpack 
  (5.0.0.rc1) lib/action_dispatch/middleware/static.rb:136:in `call'"},{"id":13,"trace":"rack (2.0.0.rc1)  
  lib/rack/sendfile.rb:111:in `call'"},{"id":14,"trace":"railties (5.0.0.rc1) lib/rails/engine.rb:522:in `call'"},
  {"id":15,"trace":"rack (2.0.0.rc1) lib/rack/handler/webrick.rb:86:in `service'"},
  {"id":16,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in 
  `service'"},{"id":17,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in 
  `run'"},{"id":18,"trace":"/Users/msuzo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block 
  in start_thread'"}]}}

I am not exactly sure what I am doing wrong (especially since my tests are passing).

Routes:

require 'api_constraints' 

UlonkaApi::Application.routes.draw do 
  namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api'}, path: '/' do
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do 
      resources :continents, only: [:show]
    end
  end
end

Rake routes returns:

  Prefix Verb URI Pattern                                 Controller#Action
  api_continent GET  /continents/:id(.:format) api/v1/continents#show {:subdomain=>"api", :format=>: }

Contents of api_constraints file:

 class ApiConstraints
  def initialize(options)
    @version = options[:version]
    @default = options[:default]
  end

  def matches?(req)
    @default || req.headers["Accept"].include?("application/vnd.ulonka.v#{@version}")
  end
end

cURL command being run in terminal:

curl -H 'Accept: application/vnd.ulonkaapi.v1' http://localhost:3000/continents/1

Rails version being used is Rails 5.0.0.rc1 and Ruby version is 2.3.0. Server is webrick

Would appreciate it if someone could please explain what concept I am failing to grasp. Thank you very much.

msuzoagu commented 8 years ago

Googled around a bit more and finally figured out the problem was related to my route having a constraint requiring a subdomain.

For prosperity sake, listed below are the resources I read to understand what was going on:

If you are using Puma: