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

page_footer_300rect




page_footer_300rect




-BackEnd
-

執筆者:


  1. ||=とおりすがり。 より:

    本家のチュートリアルと合わせて、こちらの記事も一緒に読み進めながらやってみました。おかげさまで内容を理解しながら完了できました。本当に助かりました。

comment

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

CAPTCHA


関連記事

RSpecの個人的Tips集〜その1〜

1 はじめに2 テストコードの実行をスキップする3 共通のテストコードを用意する4 外部APIの返却値をスタブにする5 さいごに はじめに みなさん、テストコードは書かれているでしょうか? 私も極力書 ...

rails

私たちのFactoryGirlとRspecの使用ルール その1

1 はじめに2 そもそもなぜ基本ルールなどを作成しようとしたのか?3 Rspec編3.1 describe、context、itの階層で使用する3.2 10個以上のテストレコードを作成したい場合は、ト ...

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

rails

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

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

麻雀で自分が何を切るか学習させる

1 はじめに2 プロジェクト名を決めてみる3 何切る問題で考慮される要素3.1 手牌3.2 ドラ3.3 考慮していない要素(本当は入れたい)4 学習の方法5 さいごに はじめに 前回執筆しました、配牌 ...

AppLink

page_side_300rect

アプリ情報

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

フォロー

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

Web版MyCoach

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