Rails5のAPImodeでアプリケーションを作成するところまでやってみた話
やったこと
開発しているiosアプリのAPIを作りたく、せっかくなら18日に出たRails5のベータでも使ってみようと思い、環境を構築した。
rbenvのアップデート
rbenvを使っているのだが、rails5はruby2.2.2以上が必要だったのでアップデートをする必要があった。
# ruby-buildをアップデート $ brew upgrade ruby-build $ rbenv install 2.2.3 # 今回作成するアプリケーションにのみ2.2.3を使用する $ rbenv local 2.2.3 # 設定結果を確認 $ rbenv versions
rails5のインストール
本当はrailsアプリケーション内のGemfileで管理したかったのだが、
$ rails new my_api --api
を試してみたかったので普通に
$ gem install rails --pre
を叩いた
APImodeでのアプリケーション作成
http://edgeguides.rubyonrails.org/api_app.html を参考に
$ rails new my_api --api
と打ってみる。
generateされたアプリケーションのapplication.rb
を見てみると
config.api_only = true
application_controller.rb
も
class ApplicationController < ActionController::API end
とAPIモードでのrailsアプリケーションが生成されていた。
起動させてみる
なにも考えずに
$ bundle exec rails server => Booting Puma => Rails 5.0.0.beta1 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server I, [2015-12-26T13:58:52.252332 #10939] INFO -- : Celluloid 0.17.2 is running in BACKPORTED mode. [ http://git.io/vJf3J ] Puma 2.15.3 starting... * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://localhost:3000
WeblickではなくPumaが立ち上がった。(rails5がpumaを採用しているのか、apiモードのみなのかはまだ調べられていない。というか4.1系をずっと使っていたのでどこかのタイミングで変わったのか、、?)
とりあえずアクセスするといつものページが表示されたので、ひとまず起動はうまくいったっぽい。
APIっぽい仕事をさせてみる
class PostsController < ApplicationController def index @posts = Post.all render json: @posts end def show @post = Post.find_by(params[:id]) render json: @post end end
上記のような適当なコントローラを作成して(省略しますがモデルやルーティングも)
localhost:3000/posts/1
を叩いたら
{"id":1,"name":"hogehoge","contents":"fugafuga","created_at":"2015-12-26T05:46:08.955Z","updated_at":"2015-12-26T05:46:08.955Z"}
と結果が返ってきてくれた。
なにが嬉しいのか
正直上のようにjsonで返すことを明記すれば今までのrailsでも同じような挙動になっていたはず。(というかそのようにAPIサーバをrailsで構築していたものを多いと思う。もちろんGrapeとか使っているのも多いけど)
おそらく僕がリファレンスなどを全然読めてないので、もっとAPIに特化したうまい書き方があるはず。
また、今回のAPIモードの最大のポイントはAPIサーバとして必要最低限のミドルウェアで動かせる、というところのような気がしているのでもっと大きなデータで検証とかしてみたいと思った。
そんなわけでさらっと使ってみただけだと、なにが嬉しいのかあまり実感できなかったが、ミドルウェア周りの話とかAPサーバの話とか、単に自分に知識がないから実感できていないだけの気がしたので勉強します。。。