2015-07-01 7 views
4

Я пытаюсь настроить рельсы винограда api с ниже структуры.NoMethodError: неопределенный метод в routes_with_grape

app 
    api 
    api 
     V1 
     user.rb 
     app.rb 

Я получаю эту ошибку, когда я бегу 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) 

Вот мой код

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 

Спасибо!

+0

Я получаю эту же проблему – juliangonzalez

ответ

0

Ditch, что драгоценный камень и использовать этот код (скопированный из 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 

вставить его в Rakefile и изменения:

route_info = API.routes.map 

с вашим API точки крепления в моем случае: под приложение /api/web/api.rb У меня есть

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

Поэтому я заменил API.route s по Web :: API.routes

Смежные вопросы