JRuby
環境構築
JavaでSpring-bootを使おうとしたけど、連携の面倒さに辟易したのでJRubyを試す
IDE
- 他の人にもインストールさせると想定してAtomを使ってみる
- Emacsキーバインドは基本
結局, Atom v1.19.6でatomic-emacsパッケージをインストールした。
JRuby
適当にインストーラからインストールすること、バージョン 9.1.13.0
>jruby --version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 jruby 9.1.13.0 (2.3.3) 2017-09-06 8e1c115 Java HotSpot(TM) 64-Bit Server VM 25.112-b15 on 1.8.0_112-b15 +jit [mswin32-x86_64]
Git
> apm install git-plus
ターミナル
bundler, railsコマンドを使いたいので以下を導入
Atomを導入済みであれば、apmコマンドでパッケージをインストールできるはずなので、そうする。
> apm install platformio-ide-terminal
再起動したら Ctrl+バッククォートというすっごいわかりにくいショートカットで起動する
起動した図、これは結構うれしい
日本語化
- apm install して再起動
> apm install japanese-menu
JRuby on Rails
GettingStarted
GettingStarted を見て、まずはRailsを入れる。
> jruby -S gem install rails
実行すると、java版のいろいろなライブラリが入る。ネイティブ(C言語連携してるやつ)のライブラリに関してはjavaで書き直す必要があったのだろう。
終わったらさっそく rails new <プロジェクト名> で作成する
→ 動きませんでした…
Hanami on Jruby
それでは、ということで最近話題のHanamiを動かしてみる
> jruby -S gem install hanami > jruby -S hanami new generic-dao-jruby > cd generic_dao_jruby > jruby -S bundle install > jruby -S bundle exec hanami s
動いた!
REST APIを作ってみる
最初の目的であるREST APIを作る
作りたいもの
- MySQLのお手本テーブルである employees をJSONで出力するやつ
- テーブル定義は → MySQL Sample Databases
- APIの場所は /rest/v1/employees にしたい
Hanami - ドキュメント
- Guides / 1.0 / Command Line / Command Line: Generators
- ここにアクションやルートテーブルの生成用のコマンドが載っている
新規アプリの追加
> jruby -S bundle exec hanami generate app api
これで apps/api という階層ができる。Railsと違って複数のアプリが作成できるようだ。
新規Action/Viewの追加
> jruby -S bundle exec hanami generate action api employees#list
これで employees というActionができる。ルートテーブルにもいろいろ追加された。
- ここまででできていること
- Hanamiの全体設定としてのアプリのURL(マウント)設定
- config/environment.rb に Api アプリケーションのマウント場所が書いてある
- つまり、http://{ホスト名}/api 以下にアプリが配置されるということ
Hanami.configure do mount Api::Application, at: '/api' ...
- Apiアプリの設定ファイル
- apps/api/application.rb に Api アプリケーションの設定が書いてある
- デフォルトではhtmlを返す設定になっているので、API用に以下を追記する
module Api class Application < Hanami::Application configure do # 以下を追加 default_request_format :json default_response_format :json body_parsers :json ...
- employeesのためのコントローラー
- apps/api/controllers/employees/list.rb に employeesを返すためのModuleができている
- これの面白いところはコントローラーがメソッドごとに分割されているところだろう
module Api::Controllers::Employees class List include Api::Action accept:json # 追加 def call(params) end end end
- employeesのためのビュー
- apps/api/views/employees/list.rb に オブジェクトをJSONにして返すためのModuleができている
- これもメソッドごとに分割されている
module Api::Views::Employees class List include Api::View # 以下を追加 layout false def render "[]" end end end
新規Entity/Repositoryの追加
ここでモデルと言わずE/RになってるのはRailsと違うところなのだと思う。
- employeeのモデルクラス作成
- モデルは単数形になることに注意
> jruby -S bundle exec hanami generate model employee
- 元となる理想のテーブル定義(MySQL)
CREATE TABLE employees ( emp_no INT NOT NULL, -- UNSIGNED AUTO_INCREMENT?? birth_date DATE NOT NULL, first_name VARCHAR(14) NOT NULL, last_name VARCHAR(16) NOT NULL, gender VARCHAR(1) NOT NULL, -- Enumeration of either 'M' or 'F' hire_date DATE NOT NULL, PRIMARY KEY (emp_no) -- Index built automatically on primary-key column -- INDEX (first_name) -- INDEX (last_name) );
- 作成されたmigrationファイルを改変する
- db/migrations/YYYYMMDD000000_create_employees.rb
Hanami::Model.migration do change do create_table :employees do primary_key :emp_no, Integer, null: false column :birth_date, Date, null: false column :first_name, String, null: false, size: 14 column :last_name, String, null: false, size: 16 column :gender, String, null: false, size: 1 column :hire_date, Date, null: false end end end
Hanamiのマイグレーションファイルの書き方は、ここに書いてある
そして、実は生のSQLでも実行できる
Hanami::Model.migration do up do execute %{ INSERT INTO `employees` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'), (10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'), (10003,'1959-12-03','Parto','Bamford','M','1986-08-28'), ... } end end
employeeのDBのテーブルを作成
以下の手順でエラーが出たときは、おそらくWindows/Unix間のパスの問題なので .env.development を見る
- .env.development
- windowsの場合、migrate実行時は"jdbc:sqlite:db\\[sqliteのdbファイル名] にする必要がある
DATABASE_URL="jdbc:sqlite:db\\generic_dao_jruby_development.sqlite"
- 開発環境はSQLite3で動く、ゼロから始める場合は以下のコマンドでdbファイルを作成
> jruby -S bundle exec hanami db create
- その後以下のコマンドでSQLを実行
> jruby -S bundle exec hanami db migrate
JSONを返す部分を追記
とりあえず、以下の追記でサーバを再起動すればJSONが出力されるはず
- apps/api/controllers/employees/list.rb
class List include Api::Action accept :json + expose :employees def call(params) + @employees = EmployeeRepository.new.all end end end
- apps/api/views/employees/list.rb
module Api::Views::Employees class List include Api::View layout false def render - "[]" + _raw JSON.dump(employees.map{|employee| employee.to_h }) end end end