Rails5 Beta2を触ってみた

フレームワークを使って簡単なAPIサーバを立てる機会がありました。本当に軽いAPIだからSinatraとかで十分なんだけれど、せっかくだから使ってみようかと思いRails5を試してみました。

構成はこんな感じ

$ rails new test_app --skip-bundle --skip-test --skip-action-mailer --skip-action-cable --api -d postgresql

目玉機能の1つである action_cable ですが --skip-action-cable にあるように今回は使っていません。API modeは使っています。 以下のようなファイルたちが生成されました。ActiveJobも使わないんだけどskipさせる方法がわからなかったので手動で消します。

$ tree ./ 
./
├── Gemfile
├── README.md
├── Rakefile
├── app
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── jobs
│   │   └── application_job.rb
│   ├── mailers
│   └── models
│       ├── application_record.rb
│       └── concerns
├── bin
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── setup
│   └── update
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── active_record_belongs_to_required_by_default.rb
│   │   ├── application_controller_renderer.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── callback_terminator.rb
│   │   ├── cors.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   └── secrets.yml
├── config.ru
├── db
│   └── seeds.rb
├── lib
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── tmp
│   └── cache
├── tree
└── vendor

20 directories, 39 files

app/views が作られていません。新たにscaffold等でgenerateすると、controller側でActiveRecordインスタンスを返すようになっています。今回はこれで問題ありません。またviewがないのでsprocketsやturbolinksも自動的にskipされているのが確認できます。500や404はhtmlのまま残っているので修正が必要そうです。

rails_apiRails本体に取り込まれる前と同様に、ApplicationControllerは ActionController::API を継承したものになっていますね。

class ApplicationController < ActionController::API
end

config/application.rb にも api_onlytrue になっています。

# 省略
module TestApp
  class Application < Rails::Application
    config.api_only = true
  end
end

継承のことで言うと、ユーザーが追加するmodelが今までは ActiveRecord::Base の子クラスとして生成されていましたが、Rails5では ActiveRecord::Base を継承した ApplicationRecord の子クラスとして生成されます。1つ抽象クラスが間に入った形になりますので、複数モデル間で共通のメソッドはここに定義しておくことができます。ファットモデルを避けるためにService層なんかを導入するやり方がありましたが、それに近いものが標準で提供されました。

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

次にアプリケーションサーバです。4.2まではデフォルトのアプリケーションサーバWebrickでした。これはシングルプロセスなのですが、ActionCableは余っているプロセスを使ってwebsocketを提供するものなので、Webrickでは利用できないことになります。なのでデフォルトでPumaが入るように変更されました。Rails5.0.0.beta1 Release に詳しく書かれています。Herokuおすすめの設定 に変更。

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

$ rails server でPumaが立ち上がります。

$ bundle exec rails server
=> Booting Puma
=> Rails 5.0.0.beta2 application starting in development on http://localhost:3000             
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Puma 2.16.0 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:3000

localhost:3000 にアクセスするとこんなページが表示されます。

f:id:wata_ori:20160207154112p:plain

Rails5からロゴが変わりましたね。 特に問題なくここまで来れました。

ここにRSpecやFactoryGirlを入れたりして今までと同じようにコードを動かしていましたが、ところどころで5.1では完全に使えなくなるよというwarningが出てきます。 やはりBeta版ということもありまだ対応できていないライブラリもあるので、注意が必要です。

(修正) ここにコードを置いておきます。

github.com