Ruby
Rails
hanami

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

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

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

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

開発環境:computer:

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

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

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

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

スクリーンショット 2017-12-14 18.53.31.png

2.登録とuploadができる

スクリーンショット 2017-12-14 18.55.23.png

3. 一覧に表示される

スクリーンショット 2017-12-14 18.55.51.png

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:cherry_blossom:で写真投稿サイトを作る:camera:

1.新しいideaを登録

スクリーンショット 2017-12-14 18.58.21.png

2.登録とuploadができる

スクリーンショット 2017-12-14 18.59.31.png

3. 一覧に表示される

スクリーンショット 2017-12-14 18.59.58.png

コードはこちら

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:railway_car:は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:cherry_blossom:は機能ごとに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:railway_car:

gem 'carrierwave'

Hanami:cherry_blossom:

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

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

まとめ

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

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

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