LoginSignup
6
7

More than 5 years have passed since last update.

Grape でAPIを作るときにハマったこと

Posted at

やりたいこと

railsでのAPI作成の学習のためにgrapeを使ってかんたんなAPIを作る。
学習のための備忘録。

手順

  1. grapeのインストール
  2. プロジェクト内にapiディレクトリを作成してルーティングを設定する

grapeのインストール

$ gem install grape

#or
$ emacs Gemfile
# grape を追加

$ bundle install

ディレクトリの構成

app
 |- apis
      |- api
           |-v1

みたいな感じで構成
grapeはapi周りのファイルをapp以下のapiというディレクトリにいれる。

スクリーンショット 2016-10-09 19.35.40(2).png

上記のようなディレクトリ構成とroutingのためのroot.rbをapiディレクトリとapiのバージョンのディレクトリに作成する。

まずはapiディレクトリ配下のファイルを読み込むためにオートローディングの設定を行い、その後、/apiのURLをapiディレクトリに合わせる設定を行う

config/application.rb

# 以下二行を追加。やっていることはpathの追加とautoloadの設定
config.paths.add File.join('app', 'apis'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'apis', '*')]

これでAPIというモジュールが動作します。

config/route.rb
Rails.application.routes.draw do
  mount API::Root => '/api' # 追加
end

/apiというURLが呼ばれた際はapis/api以下のファイルが呼ばれます。
使用するAPIを指定するために、api以下のディレクトリをマウントします。

apis/api/root.rb
module API
  class Root < Grape::API
    mount API::V1::Root
  end
end

最後にv1以下のルーティングを呼ぶ設定をします。

apis/api/v1/root.rb

module API
  module V1
    class Root < Grape::API
      version 'v1', using: :path
      format :json

      get '/' do
        puts 'test'
      end
    end
  end
end

domain/api/v1を実行して、コンソールに'test'が表示されればOK。

はまったところ。

最初以下のようなディレクトリ構成にしていたらNameMethodエラーが起きてしました。
route.rbでapiディレクトリのroot.rbを指定してたのですが、APIがそもそもインスタンス化されいない?というエラーが出てしまい思いっきりハマりました。

最初のオートロード設定

config/applicaiton.rb
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
最初のディレクトリ構成
app
 |- api ←ここにオートロードがあっていない。
      |-v1

これでUninitialized constant APIエラーが発生してしまってました。

原因と解決策なのですが、app以下のapi関連のファイルを入れるディレクトリの階層を現在と同じにしたら解消しました。
autoloadingの設定あたりがうまく行ってなかったのかなーと思ったんですが、apiに関連するファイルするディレクトリの階層と名前空間?の関連性がいまいち理解できていなかったのが原因だったのかなと。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7