たくろぐ!

仕事はエンジニア、心はアーティスト

最近のRails/Ruby環境にキャッチアップする30日間チャレンジ1日目

はじめに

Ruby/Railsの情報がだいぶ抜け落ちているので
あらためて復習も兼ねてこちらにまとめて行こうと思う。

07/02

Rails Developers Meetup

@a_matsudaさんの発表の中で出たgemを整理した。

Railsプラグイン

heaven_door

Capybaraのシナリオが書ける?

hocus_pocus

???

erb

ER図書ける?

roundabout

E2Eテストのカバレッジ表示。

still_life

Railsアップデートでの利用想定。

週刊Railsウォッチ

以下を読みました。

performメソッド

Railsにおけるベストプラクティスの話(2017年なので古い)。

postgreSQLの話が多かった。

以下がよかった。

最初に、モジュールを1つ作成します。これをincludeすると、performという名前のクラスメソッドを作成します。 次に、作成するすべてのサービスで、コンストラクタ(initialize)をprivateにします。つまり、このperformパブリッククラスメソッドだけを呼ぶということです(もちろんRubyのような動的言語ではprivateメソッドも呼ぼうと思えば呼べますが、単に呼びにくくするだけの処置です)。

Railsにおけるデザインパターン

Value Object
Service Object
Form Object
Query Object
View Object
Policy Object
Decorator

こちらも初版が2013年と古いので注意。

rbenvで管理している各Rubyバージョンのgemをアップデートする

rbenv-eachをインストール後rbenv each gem update --systemを実行すると続々とRubyGemsが2.7.9または3.0.3にアップグレードされました。

基本的にプロジェクトでは複数のバージョンのRubyを使うことが多いので便利そう。

Rails Conductor

同じ記事から。

Webコンソール(ブラウザの下部にerbが立ち上がる感じ)でRubyのコマンドとかを操作できるっぽい?

あまり進んでないから無視してもいいかも?

GitHubRailsプロジェクトをStarの大きいものから調べてみた

forem

dev.toをホスティングしているフレームワークっぽい。

CMSに近いかも?

更新頻度も高くて、コード読んでみるとおもしろそう。

ディレクト
cypress

cypressというディレクトリがあるが、これはJSのE2Eテスティングフレームワークっぽい。

app/decolators
app/forms
app/liquid_tags

なんだろうこれ。

app/policies
app/queries
app/refinements
app/sanitizers
app/serializers

このディレクトリの存在を忘れてたのでとりあえず読んだ。

RailsAPIモードで利用するときとかめっちゃ使いそう(察し)。

はい、よく考えてませんでした。すみません。

app/services
app/validators
app/view_objects
app/workers

diaspora

プライバシーに配慮した分散型SNSらしい。

ものすごく雑に言えば、マストドン (ミニブログ)みたいなかんじ(死語)。

マストドンWikipedia見ると連合型SNSと書いていたけど、分散型と連合型が同じ意味になるの気持ち悪い。

開発は進んでるっぽいけど、コミュニティの大半がこのOSSの関係者っぽくてdiaspora公式のPod(サーバ)で10万人くらい。

それ以外は多くても1万人くらいのコミュニティしかなくて微妙な感じだった。

特筆すべき点なし。散ッ!!!

ディレクト
app/presenters

特筆すべき内容はこのディレクトリくらい。

以下を読みました。控えめに言って最高すぎてこれだけ読めばデザインパターン完璧まである(大嘘)。

decorator, presenter, ViewModel, helperとの違いがキモ。

Presenterは元々はMVCから派生したアーキテクチャパターンのMVP(Model-View-Presenter)の考えからきた概念のようです。Controllerの肥大化防止、テスタビリティの向上が期待できるみたいです。

説明じょうず。

Decorator 単一のモデルクラスに対応する ViewModel Presenter 複数のモデルクラスにまたがる ViewModel 永続化されたモデルと一致しない ViewModel ViewModel Decorator 、Presenter の上位概念。ビューに関連するロジックをまとめるレイヤーを指す。

すごい。めっちゃわかる。

MVVM(Model - View - ViewModel)はNativeApp(iOS/Android)でよく語られているイメージ。

どうでもいいけど、ViewModelってモデル層とビュー層の間のプレゼンテーション層だからM-VM-Vのほうが実態に即していると思うけど、語呂がいいほうを取ったのかな。

DraperはRailsのプレゼンテーション層の役割を担うgemです。 プレゼンテーション層とはviewとモデルの中間に位置し、モデルやビューに実装されやすい表示ロジック/フォーマットを記述する役割を担います。

ViewとPresenterの関係性は以下。

・View(UI)はPresenterのことを知るべきではない ・PresenterはViewからメッセージを受け取り、それに基づいて処理を行い、Viewに反映する これは「ViewはPresenterに依存せず、PresenterはViewに依存する」ということ

あと超どうでもいいけどMVVMでググると、「Prism WPF(UWP)」というサジェストキーワードが出てきて、どうやらWindowsデスクトップアプリを開発するためのフレームワークっぽい。

ほんとどうでもいい(失礼)。

また、永続化されないケースやActiveRecord化されていないモデルなんかもPresenterで扱うそうです。 ViewModelについてはView ObjectとかPresenter層と表現されることも多いですが、ビューに関連するロジックをまとめるレイヤーと解釈すれば問題ないかと思います。

うわー。さすが。

decoratorはdraper、ActiveDecoratorというgemで導入が可能。

draperのほうが利用数が10倍くらい多い。

DDDやクリーンアーキテクチャが優勢なので今更使うかどうかはさておき、特段の理由がなければdraperでいいのでは?と。

ちなみにhelperとの違いは以下。

helperはモデルから独立し直接関係していない描画ロジックを実装するのに用います。
それに対して
Decoratorは特定のモデルにがっつり関連した描画ロジックを実装するのに用いる
というものです。

まず、 helper にはスコープの問題があります。名前空間がグローバルなので、メソッド名が衝突する危険性があります。 一方、 ViewModel は関連するビューのドメインごとにクラスを分割するので、その危険性はありません。

深いですね。やはりほかのものと比較することで理解が深まる。

単一モデルに対応するDecoratorと複数モデルに対応するPresenterの使用例は以下に載ってました。

presenterを利用する前のcontroller

class PopupsController < ApplicationController
  def index
    if current_user.campaign_user?
      @campaign_message = Message.where(...)
      @campaign_popups = Popup.where(...)
    end
    # ...
  end
end

presenterでプレゼンテーション層を作成

class PopupPresenter
  def initialize(user)
    @user = user
  end

  def campaign_user?
    @user.campaign_user?
  end

  def campaign_message
    @campaign_message = Message.where(...) if campaign_user?
  end

  def campaign_popups
    @campaign_popups = Popup.where(...) if campaign_user?
  end
end

controllerがすっきり!

class PopupsController < ApplicationController
  def index
    @presenter = PopupPresenter.new(current_user)
    # ...
  end
end

べんりー--。

その他

ActionView::Helpers::CaptureHelper#capture