Rails5 Beta2を触ってみた
フレームワークを使って簡単なAPIサーバを立てる機会がありました。本当に軽いAPIだからSinatraとかで十分なんだけれど、せっかくだから使ってみようかと思いRails5を試してみました。
構成はこんな感じ
- サーバ: Heroku
- DB: PostgreSQL(9.5.0)
- アプリケーションサーバ: Puma
$ 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_api がRails本体に取り込まれる前と同様に、ApplicationControllerは ActionController::API
を継承したものになっていますね。
class ApplicationController < ActionController::API end
config/application.rb
にも api_only
が true
になっています。
# 省略 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
にアクセスするとこんなページが表示されます。
Rails5からロゴが変わりましたね。 特に問題なくここまで来れました。
ここにRSpecやFactoryGirlを入れたりして今までと同じようにコードを動かしていましたが、ところどころで5.1では完全に使えなくなるよというwarningが出てきます。 やはりBeta版ということもありまだ対応できていないライブラリもあるので、注意が必要です。
(修正) ここにコードを置いておきます。