Hanamiで写真投稿サイトを作ってみた


ファーストサーバ AdventCalendarの16日目です。
普段私は Ruby on Rails を使って開発しています。

RubyのフレームワークはRailsだけではありません。
るびまにこんな記事が出てました.. Hanami??

RailsとHanamiで写真投稿サイトを作ってみて、比べてみたいと思います!
参考: Rails Girls

開発環境

  • Ruby on Rails
Ruby 2.3.5
Rails 4.2.5.1
  • Hanami
Ruby 2.3.5
Hanami v1.1.0

Railsで写真投稿サイトを作る

簡単な写真投稿サイトを作ります。
RailsGirlsを参考にさせていただきました!

  • idea というmodelを作成、name description picture という項目に登録できる
  • picture には画像をアップロードできる といったものです
1.新しいideaを登録

2.登録とuploadができる

3. 一覧に表示される

console
Idea.last
=> #<Idea id: 1, name: "cherry.rb", description: "cherry.rbです", picture: "スクリーンショット-2014-07-27-14.31.45.png", created_at: "2017-11-28 09:57:34", updated_at: "2017-11-28 09:57:34">

これと同様のものをHanamiで作ろうと思います!

Hanamiで写真投稿サイトを作る

1.新しいideaを登録

2.登録とuploadができる

3. 一覧に表示される

コードはこちら

RailsとHanamiのここが違ってておもしろかった、と思った点を
あげていきたいとおもいます!

ここが違うよRailsとHanami

1. RailsはMVC, HanamiはDDD

ここが最大の特徴だと思います。
Hanamiにはmodelというフォルダはなく、lib以下に RepositoryEntity というフォルダがあり、役割がそれぞれ分かれています。
その辺の話はるびまに詳しく載っていました。

lib/
└── hanami-shrine/
    ├── entities/.      -- RDBMSテーブルをRubyで表現する
    └── repositories/.  -- RDBMSテーブルに対するCRUD操作を行う

モデルの生成の仕方も以下のようになります。

  • Rails: Idea.new
  • Hanami: IdeaRepository.new

2. ControllerとView

Railsはmodelごとにcontrollerが作られます。

├── controllers
│   ├── application_controller.rb
│   ├── concerns
│   └── ideas_controller.rb
└── views
    ├── ideas
    │   ├── _form.html.erb
    │   ├── _idea.json.jbuilder
    │   ├── edit.html.erb
    │   ├── index.html.erb
    │   ├── index.json.jbuilder
    │   ├── new.html.erb
    │   ├── show.html.erb
    │   └── show.json.jbuilder
    └── layouts
        └── application.html.erb

Hanamiは機能ごとにcontrollerが作られます。
controllerやviewのテストが小さく書けそうです!

├── controllers
│   └── ideas
│       ├── create.rb
│       ├── destroy.rb
│       ├── index.rb
│       ├── new.rb
│       └── show.rb
└── views
    ├── application_layout.rb
    └── ideas
        ├── create.rb
        ├── index.rb
        ├── new.rb
        └── show.rb

3. 使用するGem

ファイルアップロード機能を実装するのに、以下のgemを使いました。

Rails

gem 'carrierwave'

Hanami

gem 'shrine'
gem 'hanami-shrine', '0.2.1'

実装するにあたり、このへんを参考にさせていただきました
https://github.com/janko-m/shrine
http://katafrakt.me/2016/02/04/shrine-hanami-uploads/

まとめ

Rails便利なgemやmethodが多い & ドキュメントも多いので、やはり使いやすいです。
ですが、やはり構造上、機能が増えていくとFat Modelになってしまう懸念があります。

Hanamiはまだまだ発展途上でできないことも多いですが、機能追加ごとにファイルが分かれる & テストも分かれるので、メンテナンスしやすいのではないかなと思いました。

今度はちゃんとテストも書こう..