Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

ファーストサーバ 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:

tono0123
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away