2

Rails 3.2.11 アプリで Grape API を実行しようとしています。ブドウのドキュメントによると、次の行を config/application.rb に追加する必要があります。

# Auto-load API and its subdirectories
config.paths.add "app/api", :glob => "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]

そして、以下のコードで config/initializers/reload_api.rb を作成します:

if Rails.env.development?
  api_files = Dir["#{Rails.root}/app/api/**/*.rb"]
  api_reloader = ActiveSupport::FileUpdateChecker.new(api_files) do
    Rails.application.reload_routes!
  end
  ActionDispatch::Callbacks.to_prepare do
    api_reloader.execute_if_updated
  end
end

しかし、それは私にとってはうまくいきません。これが私のコードです。私の app/api/v1.rb では:

module Api
  class V1 < Grape::API

    get '/hello' do
      []
    end
  end
end

そして私のconfig/routes.rb:

Blog::Application.routes.draw do

  mount Api::V1 => "/"
end

実行するrake routesと、次のエラーが表示されます。

uninitialized constant Api
/home/zoloo/code/nomin/config/routes.rb:7:in `block in <top (required)>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:282:in `instance_exec'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:282:in `eval_block'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb:260:in `draw'
/home/zoloo/code/nomin/config/routes.rb:5:in `<top (required)>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:40:in `block in load_paths'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:40:in `each'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:40:in `load_paths'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:16:in `reload!'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:26:in `block in updater'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/activesupport-3.2.11/lib/active_support/file_update_checker.rb:78:in `call'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/activesupport-3.2.11/lib/active_support/file_update_checker.rb:78:in `execute'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:27:in `updater'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/routes_reloader.rb:7:in `execute_if_updated'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application/finisher.rb:66:in `block in <module:Finisher>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/initializable.rb:30:in `instance_exec'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/initializable.rb:30:in `run'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/initializable.rb:55:in `block in run_initializers'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/initializable.rb:54:in `each'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/initializable.rb:54:in `run_initializers'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application.rb:136:in `initialize!'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/railtie/configurable.rb:30:in `method_missing'
/home/zoloo/code/nomin/config/environment.rb:5:in `<top (required)>'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application.rb:103:in `require'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application.rb:103:in `require_environment!'
/home/zoloo/.rvm/gems/ruby-1.9.3-p194@rails-3.2.11/gems/railties-3.2.11/lib/rails/application.rb:297:in `block (2 levels) in initialize_tasks'
Tasks: TOP => routes => environment
(See full trace by running task with --trace)

RailsがAPIを読み込めないという明らかな例外です。なんで?

4

1 に答える 1

7

自動ロード パスを次のように変更します。

config.autoload_paths += Dir["#{Rails.root}/app"]

require が解決を試みるとき、Api::V1最初に というファイルを探しますapi_v1.rb。それは存在しません。次にapi/v1.rb、すべての自動ロード パスを検索します。またapp、自動読み込みパスにはありませんが、app/apiそのすべてのサブフォルダーにはあります。上記のコードでは、 に入れる必要がありv1.rbますapp/api/api/v1.rb

于 2013-02-13T19:26:08.947 に答える