JQ Blog

Grape Gem

Grapeとは

Grape gemはruby用のREST-APIフレームワークです。簡単にRESTfulなAPIを開発するための単純なDSLを提供することによって、Railsとシナトラなどの既存のWebアプリケーションフレームワークを補完するために設計されています。

Grape gemの実装

Grape gemのインストール

まず、GemfileにGrapeを追加します。
Gemfile

gem 'grape'


bundle installをします。

bundle install


model追加

modelを追加してみます。

rails g model test_data name:string age:integer
 
rake db:migrate


application.rbの設定

application.rbに以下のように書き、apiのパスを設定します。
application.rb

config.paths.add File.join('app''api'), glob: File.join('**''*.rb')
config.autoload_paths += Dir[Rails.root.join('app''api''*')]


API作成

appフォルダーにapiフォルダーを追加します。 ここに二つのファイルを作ります。一つは実際にapiとして動くファイルで、もう一つはそのファイルをmountするファイルです。 下のように書いてみます。
api/user/data.rb

resource :user_data do
    desc "List all User"
    get do
        TestData.all
    end
end


api/api.rb

class API < Grape::API
  prefix 'api'
  version 'v1', using: :path
  mount User::Data
end
 


APIのルーティング追加

route.rbにルーティング追加します。
route.rb

mount API => '/'


それからrailsのserverを起動します。

rails server


タミナールに下のように入力してみます。

curl http://localhost:3000/api/v1/user_data.json


そうすると、databaseに何もないので 「[ ]」 しか出てこないです。
では、データーを入れてみましょう。
まずはdata.rbにソースコードを追加します。もっと楽にするようにヘルパーを書きます。

helpers do
    def user_params
      ActionController::Parameters.new(params).permit(:name, :age)
    end
 
    def set_user
        @user = TestData.find(params[:id])
    end
end


そして、下のようにcreateのコードを書きます。

desc "create a new user"
params do
  requires :name, type: String
  requires :age, type: Integer
end
post do
  TestData.create!(user_params)
end


タミナールにこう書くと、

curl http://localhost:3000/api/v1/user_data.json -d "name=Jo&age=30"


{"id":1,"name":"Jo","age":30,"created_at":"2016-07-26T07:15:11.212Z","updated_at":"2016-07-26T07:15:11.212Z"}

簡単にデーターベースに入れ込みます。
deleteとupdateも同じように作成します。

desc "delete an user"
params do
  requires :id, type: String
end
delete ':id' do
  set_user
  @user.destroy!
end
 
desc "update an user"
params do
  requires :id, type: String
end
put ':id' do
  set_user
  @user.update(user_params)
end


タミナールで実行してみると、

curl -X DELETE http://localhost:3000/api/v1/user_data/1.json
 
{"id":1,"name":"Jo","age":30,"created_at":"2016-07-26T05:11:16.608Z","updated_at":"2016-07-26T05:11:16.608Z"}


もう一度データーを作って

curl http://localhost:3000/api/v1/user_data.json -d "name=Jo&age=30"
 
{"id":2,"name":"Jo","age":30,"created_at":"2016-07-26T05:16:45.169Z","updated_at":"2016-07-26T05:16:45.169Z"}


curl -X PUT http://localhost:3000/api/v1/user_data/2.json -d "age=100"
 
true


showの部分はちょっと迷いましたけど、

desc "show an user"
params do
  requires :id, type: String
end
route_param :id do
  get do
     set_user
  end
end


こういうふうにGETをroute_paramに変えると簡単にできました。