トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

JRuby

[Ruby]

JRuby

  環境構築

JavaでSpring-bootを使おうとしたけど、連携の面倒さに辟易したのでJRubyを試す

IDE

結局, 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で出力するやつ
  • APIの場所は /rest/v1/employees にしたい

  Hanami - ドキュメント

新規アプリの追加

> 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.rbApi アプリケーションのマウント場所が書いてある
  • つまり、http://{ホスト名}/api 以下にアプリが配置されるということ
Hanami.configure do
  mount Api::Application, at: '/api'
...
Apiアプリの設定ファイル
apps/api/application.rbApi アプリケーションの設定が書いてある
  • デフォルトでは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
atom-terminal.PNG hanami.PNG
お名前: コメント: