3

Rails アプリにマウントしようとしている 2 つの API があります。1 つは「v1」と呼ばれ、もう 1 つは「twilio」と呼ばれます。各 API は複数のファイルで構成されるため、それぞれに独自のフォルダーが必要です。app/api ディレクトリ内には、'v1' と 'twilio' という 2 つのフォルダーと、2 つの API をマウントするために使用しようとしている 'api.rb' というファイルがあります。その内容は次のとおりです。

module API
  class V1 < Grape::API
    prefix "api"
    format :json
    mount API::Root => '/v1'
  end

  class Twilio < Grape::API
    prefix "twilio"
    format :xml
    mount API::Twilio_API => '/twilio'
  end
end

「v1」ディレクトリには、次のように始まる「root.rb」というファイルがあります。

module API
  class Root < Grape::API
    version 'v1', :using => :header
    ...

「twilio」ディレクトリには、次のように始まる「twilio_api.rb」というファイルがあります。

module API
  class Twilio_API < Grape::API
    version 'v1', :using => :header
    ...

私のルートファイルには次のものがあります:

mount API::V1 => "/"
mount API::Twilio => "/"

Rails サーバーを起動すると、次のエラーが表示されます。

`load_missing_constant': Expected [My rails app]/app/api/v1/root.rb to define Root (LoadError)

root.rb は確かに Root クラスを定義しているので、これはわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

7

Grape では、複数の API を別の API にマウントできます。つまり、API 用に 1 つの「基本」クラスを用意して、他のすべてをそのクラスにマウントできます。

ファイル構造:

app/
  api/
    v1/
      v1_api.rb
    twilio/
      twilio_api.rb
    api.rb

アプリ/api/api.rb:

require 'v1/v1_api'
require 'twilio/twilio_api'

module API
  class Base < Grape::API
    mount API::V1
    mount API::Twilio
  end
end

アプリ/api/v1/v1_api.rb:

module API
  class V1 < Grape::API
    prefix "v1"
    format :json

    get :hello do
      { text: 'Hello from V1' }
    end
  end
end

アプリ/api/twilio/twilio.rb:

module API
  class Twilio < Grape::API
    prefix "twilio"
    format :xml

    get :hello do
      { text: 'Hello from Twilio' }
    end
  end
end

config/routes.rb:

mount API::Base => '/api'

Rails サーバーを再起動すれば準備完了です。また、app/api/twilio および app/api/v1 ディレクトリからファイルを簡単に自動ロードできるはずなので、それらを要求する必要はありません。

于 2013-05-13T11:09:16.743 に答える
0

クラス名がディレクトリ構造と同等の構造の下にあることを期待していると思います。それはあなたに与えるでしょう:

class API::V1::Root End

またはそれらの行の何か。

(スマホから…)

于 2013-05-02T22:27:52.387 に答える