BackEnd

RubyのHanamiチュートリアルをやってみた

投稿日:2017年9月13日 更新日:

はじめに

HanamiというRubyフレームワークが話題にあがっているようです。
今年のRuby Kaigi 2017でもAnton Davydov氏が発表されるようです。
Hanami – New Ruby Web Framework

今回はそんなHanamiのチュートリアルをやってみたいと思います。
公式ドキュメントはこちらになります。
HANAMI

日本語の「花見」から来ているのでしょう、TOPページは桜ですかね?

紹介

GUIDEの部分を和訳しているだけです。
(和訳はもしかすると誤りがあるかもしれませんが。。。その場合はコメントをいただけると幸いです。)

Hanamiとは?

Hanamiは、多くのマイクロライブラリーで構成された、RubyのMVCフレームワークです。
シンプルで安定したAPIと最小限のDSLを持ち、あまりにも多くの責任と魔法のように複雑なクラスを越え、プレーンなオブジェクトの使用を優先します。

明確な責任を持つ単純なオブジェクトを使用することにより、より定型的なコードになります。 Hanamiは、基本的な実装を維持しながら、余分な箇所を軽減する方法を提供します。

Hanamiを選ぶ理由

Hanamiを選ぶ理由は3つあります。

軽量

花見のコードは比較的短いです。実装に関係なく、すべてのWebアプリケーションが必要とすることのみに関心があります。
Hanamiにはいくつかのオプションモジュールが付属しており、他のライブラリも簡単に組み込むことができます。

アーキテクチャとして

あなたが「Rails Way」に反していると感じたことがあるなら、あなたは花見を良いと思うでしょう。
Hanamiはコントローラの動作をクラスベースに保ち、独立してテストしやすくしています。
また、Hanamiはユースケースオブジェクト(別名:interactors)にアプリケーション・ロジックを書くことをお勧めします。
ビューはテンプレートから分離されているため、内部のロジックを十分に包含してテストすることができます。

ちなみにHanamiはクリーンアーキテクチャに影響を受けているとのことです。

スレッドセーフ

スレッドの使用は、アプリケーションのパフォーマンスを向上させるのに最適です。
スレッドセーフなコードを書くのは難しいことではありませんし、Hanami(フレームワーク全体かその一部かに関わらず)は実行時スレッドセーフです。

チュートリアルのための準備

下記リンクのチュートリアルを実施していきます。
Getting Started

作成するものは、下記のような「本棚アプリ」になります。

「はじめに」にあたる部分のこの一言は良いですね。

But without change, there is no challenge and without challenge, there is no growth.

チュートリアルを進める上で必要な環境としては、

  • Ruby 2.3以上
  • SQLite 3以上

になります。

まずはGemのインストールです。
Gitihubリポジトリはこちらです。

プロジェクトを作成します。
デフォルトのDBはSQLiteになるようです。

いろいろファイルが生成されます。

Gemfileを見てみます。

テストフレームワークはminitestなのに、specディレクトリが生成されているんですね。
(これは注釈がありましたが、minitestでもRSpecでもどちらでもいけるそうです。)

これらのGemをインストールしてサーバーを起動します。
サーバーは2300番ポートで起動します。

これでhttp://localhost:2300にアクセスすると、下記のページが表示されます。

 

実践

はじめてのテスト

テストをする前に、テスト環境のDBをセットアップしておきます。

これでdbディレクトリにSQLiteのファイルができます。

HanamiはBDDBehavior Driven Development)を推奨しています。
実際にチュートリアルを実施する際には、テストコードから書いていますが、本記事ではテストコードは割愛させていただきます。
途中まで載せていたのですが、文章が冗長になってしまったので、泣く泣く削除しました。

もしテストコードもご覧になる場合は、下記のGithubリンクにてお願いします。
https://github.com/naoki85/bookshelf/tree/master/spec
(一応日本語でコメントもいれています。)

まずはルーティングを定義します。

ここはRailsと変わりません。
Homeコントローラーのindexメソッドを作成。。。と思ったら、コントローラーの定義の仕方が違いました。

コントローラーはまず、apps/web/controllersの下にhomeディレクトリを作成して、その中にindex.rbというファイルを作成します。

モジュールで名前空間を切って、Railsでいうアクションがクラスになっています。
include Web::Actionは現状、決まり文句でよさそうです。
def call(params)はマジックメソッドみたいなもので、このメソッドがないと呼ばれません。
paramsにGETやPOSTなどで渡されたパラメータが格納されます。

次にビューですが、基本的にレンダリングするだけであれば、templates以下に命名規則に従ってファイルを作成することで、そのテンプレートを表示してくれます。

ここまでで、テストは通りますが、views以下にビューコントローラーのようなファイルを作成しておきます。
今回は特にビューにロジックはないため、空のファイルですが、ヘルパー的なものを使用する場合やケースバイケースでテンプレートを変える場合などにお世話になりそうです。

こちらも名前空間を切って、決まり文句のinclude Web::Viewを記載しておきます。

テストを実行して、通ればOKです。

新しいアクションを生成

今度は本の一覧を表示するアクションを追加していきます。

Hanami Generatorでアクションを生成

rails generateのようなコマンドがHanamiにもあります。
指定したファイル群を生成してくれます。
今回はbooks#indexを生成します。

テストコードも含めて生成されます。
routes.rbにも自動で追記されています。

ただ、Railsのようにテンプレートの中身まで勝手に作ってくれないようなので、実際に描画されるHTMLは記載する必要があります。

これでテストは通ると思います。

共通部分をLayoutにまとめる

templates/home/index.html.erbtemplates/books/index.html.erbの両方に<h1>Bookshelf</h1>が含まれています。
これは共通部分として、共通のテンプレートに記載します。
共通テンプレートはtemplates/application.html.erbになります。

これで共通部分に移せたので、先ほどの2つのファイルからh1タグを消しておきます。

モデルの作成

Hanamiのモデルにはentityrepositoryの2種類があります。

厳密な区分は違うと思いますが、私の解釈としては、

  • entity…SQLに依存しない状態でオブジェクトを管理する場合など
  • repository…テーブルにレコードを作成、更新、削除する場合など(SQLを発行)

SQLを発行するモデルと、DBとは関係なく状態を管理できるモデルという認識です。

実際に使ってみたいと思います。
hanami generate modelで、マイグレーションファイルを含め、モデルに関連するファイルを生成できます。

appsではなく、libs以下にモデルが作成されました。
ビジネスロジックはlibs以下で管理し、apps以下に複数のマイクロサービスを管理するという考えです。
これはHanamiの大きな特徴の一つです。

マイグレーションファイルは下記のように、titleauthorカラムを追加します。

マイグレーションを実行します。

色々メッセージが出ると思いますが、下記のような状態になるかと思います。
(確認にはDB Browser for SQLiteを使用しました。)

生成されたentityrepositoryのファイルはそれぞれ下記になります。
libディレクトリ以下に作成されており、ビジネスロジックは分けるという考えが伺えます。

それぞれ、HanamiのEntityとRepositoryを継承しており、これだけで最低限の動作ができるようです。
(RailsのActiveRecordみたいな感じですね。)

ちょっとしたコードの確認はhanami consoleでできます。
色々いじってみたので、まとめます。

Indexの修正

本の一覧表示であるindexアクションを修正してDBから引っ張ってくるようにします。

まずはコントローラーです。

@books = BookRepository.new.allbooksテーブルからレコードを全件取得してインスタンス変数にセットします。

ただ、views、およびtemplatesに渡すためにはexposeで指定する必要があります。

これでbooks変数をviewsおよびtemplatesにて使用することができるようになりました。
templates/books/index.html.erbを下記のように書き換えます。

これで、DBから取得した値の一覧画面ができました。

新規登録画面と登録処理

登録フォームと登録処理を作成していきます。

hanami generateでbooks#newを生成

また、hanami generateコマンドで生成します。

先ほどと同様、ルーティングへの追記や必要なファイルは全て生成されています。

ただ、テンプレートは作成する必要があります。
今回は入力フォームが必要なので、HanamiのFormHelpersを使用します。
ここはRailsを初めとしたWebフレームワークに触ったことがあれば、理解しやすいかと思います。

hanami generateでbooks#createを生成

実際に新規登録処理をするbooks#createを生成します。

ちなみにcreateのルーティングはPOSTメソッドとして解釈されて追記されます。

ただ、コントローラーは修正の必要があるので、追記します。

かなり簡潔ですが、後ほどバリデーションを追加した際に、登録失敗した場合の処理も記載します。

パラメーターのバリデーション

バリデーションですが、モデルに書くものかと思いきや、Hanamiではコントローラー内のparamsで実施できるようです。

Parameters

requireで存在確認、filledで型を判定しています。
実際に動かしてみると分かりますが、paramsvalid?したタイミングで、下記のようなハッシュが含まれるようになります。

valid?falseだった場合は、HTTPステータスコードの422番をセットして返します。

普通であれば、再度new.html.erbをレンダリングするよう指示するところですが、それはコントローラーではなく、ビュー側の領分になります。

これでもしパラメーターが無効であっても、new.html.erbをレンダリングできます。

最後にエラーメッセージを表示する部分を追記します。

ここまでで、下図のような画面になります。

ルーティングの修正

HanamiにもRESTなルーティングを生成できるresourcesが存在するため、そちらで修正しておきます。
この使い方はRailsとほとんど同じですね。

さいごに

チュートリアルが終わった後、CSSにMaterializeを使用してみてスタイリングしてみました。

ただ、Assetsまわりはよく分からなく、CDNでもドツボにはまってしまったので、フォントなどは使えていません。
チュートリアル終了〜上記の画面までの差分はこちらになります。
https://github.com/naoki85/bookshelf/commit/7a589c97560d9144bb1a0138241b949793fb8b06

-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

RailsでERBからJavaScriptにhashを渡す方法

1 はじめに2 カスタムデータ属性とは3 実装例3.1 コントローラの実装3.2 ビューの実装3.3 実行結果4 さいごに はじめに 以前、選択したプルダウンメニューに応じて別のプルダウンメニューの内 ...

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

さらば「rails migrate」、よろしく「ridgepole」

1 はじめに2 Ridgepoleとは3 rails migrateではなく、Ridgepoleを選定した理由4 rails migrateからRidgepoleへの移行手順5 capistrano3 ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

Rubyを使ってDialogflowのお勉強

1 はじめに1.1 環境2 とりあえずAPIで叩いてみる2.1 テスト用のIntentを作成2.2 Gemの設定3 Eventについて3.1 WELCOMEイベント3.2 パラメータ付きで叩く3.3 ...

メルマガ

メールマガジン

メルマガ始めました!
詳細は以下のリンクから
http://re-engines.com/mailmagazine/

amazon

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。
下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。

アプリ情報

私たちは、目標を達成したい方を応援する、TODOアプリもリリースしております。
下記のアイコンから無料でダウンロードできます。

リンク

follow us in feedly
2017年9月
« 8月 10月 »
 12
3456789
10111213141516
17181920212223
24252627282930