Help us understand the problem. What is going on with this article?

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

More than 1 year has 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:

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした