4

I am trying to set up a rails grape api with the below structure.

app
   api
     api
       V1
         user.rb
       app.rb

I am getting this error when i run routes_with_grape

rake aborted!
NoMethodError: undefined method `ast' for "/api/ping(.json)":String
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/actionpack-4.2.1/lib/action_dispatch/journey/path/pattern.rb:14:in `initialize'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:9:in `new'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:9:in `block (3 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:8:in `each'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:8:in `block (2 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:6:in `each'
/usr/local/rvm/gems/ruby-1.9.3-p551/gems/grape-rails-routes-1.0/lib/rails/tasks/routes_with_grape.rake:6:in `block in <top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p551/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-1.9.3-p551/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => routes_with_grape
(See full trace by running task with --trace)

here is my code

user.rb

module V1
  class User < Grape::API
    desc 'Returns pong.'
    get :ping do
      { ping: params[:pong] || 'pong' }
    end
  end
end

app.rb

class API < Grape::API
  prefix 'api'
  format :json
  mount ::V1::User
end

Thanks!

Kanishka
  • 1,097
  • 5
  • 20
  • 37

1 Answers1

0

Ditch that gem and use this code (copied from here):

namespace :grape do
  desc "Grape API Routes"
  task :routes => :environment do
    mapped_prefix = '/api' # where mounted API in routes.rb
    params_str = ' params:'
    desc_limit = 45
    route_info = API.routes.map {|r| [r, r.instance_variable_get(:@options)] }
    max_desc_size     = route_info.map{|_,info| (info[:description] || '')[0..desc_limit].size }.max
    max_method_size   = route_info.map{|_,info| info[:method].size }.max
    max_version_size  = route_info.map{|_,info| info[:version].size }.max
    max_path_size     = route_info.map{|_,info| info[:path].sub(':version', info[:version]).size }.max
    max_params_digits = route_info.map{|_,info| info[:params].size.to_s.size }.max
    format_str = format(
      '%%%ds  %%%ds %%%ds %%%ds%%-%ds | %%%ds%%%ds  %%s',
      max_desc_size + 1,
      max_version_size,
      max_method_size,
      mapped_prefix.size,
      max_path_size,
      max_params_digits,
      params_str.size)

    route_info.each do |_,info|
      fields = [
        info[:description] ? info[:description][0..desc_limit] : '',
        info[:version],
        info[:method],
        mapped_prefix,
        info[:path].sub(':version', info[:version]),
        info[:params].size.to_s,
        params_str,
        info[:params].first.inspect,
      ]
      puts format(format_str, *fields)

      info[:params].drop(1).each do |param|
        puts format(format_str, *([''] * (fields.size-1)) + [param.inspect])
      end
    end
  end
end

paste it into Rakefile and modify:

route_info = API.routes.map

with your API mounting point in my case: under app/api/web/api.rb I have

module Web
  class API < Grape::API
    prefix 'api'
    mount Web::V1::Root
    # mount API::V2::Root (next version)
  end
end

So I replaced API.routes by Web::API.routes

juliangonzalez
  • 4,231
  • 2
  • 37
  • 47