DebTab

  • ホーム
  • DevTabとは
  • 記事一覧
    • きたえる
    • かえる
    • つくる
    • みちびく
    • たばねる
    • つたえる
かんたんログイン
Githubでログイン
Githubアカウントでかんたんにログインして、DevTabをもっと便利に使おう。

DebTab成長しつづけるデベロッパーのための情報タブロイド

DebTab

ログイン

検索 検索

Ruby on Railsのgem「Active Interaction」でコードの見通しをよくする

写真佐々木 将之

つくる

2018.12.10

ポイントポイント

2

本記事は ギルドワークスAdvent Calendar 10日目の記事です。

はじめに

ギルドワークスでは、Ruby on Railsで記述したプロジェクトが多く存在します。

その中で定番のGemfile構成(ライブラリ構成)があります。毎回全く同じ構成というよりは、都度新しいものを吟味しながら取り込もうとしていますが、1年ほど前から利用しているactive interactionが面白かったので紹介します。

active interactionとは

active interactionは、GoFのcommandパターンをベースに、ビジネスロジックを実装するためのクラス構成を与えるgemです。

普段だと、contorller や model に書いていたり、あるいはそれぞれの ActiveSupport::Concern で書いているロジックになっているものだと思われます。それを、active interactionのBaseクラスを継承したクラスをつくることで、見通しがよくなります。(ギルドワークスでは新たな service層として置いていることが多いです。

どのように使うか

呼び出し側

呼び出し側=controller側では、定義したクラスの「run()」メソッドを呼び出します。 「run()」の引数には、ActionContollerのoaramsをほぼそのまま渡すか、対象となるモデルの情報を載せたりします。 以下、Accountモデルの更新(Update)の例です。(サイトのものを改変しています。

def update
  # 引数inputs(hash) の整理
  inputs = { account: Account..findbyid(params[:id]) }.reverse_merge(params[:account]) 
  outcome = UpdateAccount.run(inputs) 

if outcome.valid? redirect_to(outcome.result) else @account = outcome render(:edit) end end

呼ばれる側

呼ばれる側は、 ActiveInteraction::Base を継承したクラスを実装します。

呼び出し側は「run()」でしたが、実装するメソッドは「execute()」です。

class UpdateAccount < ActiveInteraction::Base
 object :account
 string :firstname, :lastname, default: nil

 validates :firstname, presence: true, if: :firstname?  validates :lastname, presence: true, if: :lastname?

 def execute   account.firstname = firstname if firstname?   account.lastname = lastname if lastname?

  unless account.save   errors.merge!(account.errors)   end   account  end end

クラスの先頭に書いてあるobjectやstringは、inputsで渡ってくる引数の宣言です。ここに記載している引数は、デフォルトで存在チェックなどを実施します。Rubyはあまり型を意識することはない動的型付け言語ですが、静的型付け言語のような宣言的記述をするのが特徴です。

validates は、 ActiveRecord::Model と同じものが利用できます。これもひとつ実装の見通しがよくなっている理由かと思います。

executeが実際の処理内容です。
run()が呼ばれてexecute()が実行されるの時点で、既に「指定したattributesの存在チェック」と「記述したvalidatesの実施」が実行されます。ため、executeにはいわゆるガード節を最低限にでき、本来のロジックの記述に集中できます。

まとめ

以上、簡単にActiveInteractionの使い方を紹介しました。
これを利用することで宣言的に引数を記述でき、呼び出し側と呼ばれる側、双方の記述を簡素化できます。
こういったgem(ライブラリ)を利用することで、実装の見通しをよくし、「正しくつくる」ようにできればと思っています。

Photo on Foter.com

共感した

ポイントポイント

2

取り消す

この記事に共感したら、何度でも押してこの記事のポイントをみんなでアップしよう。

自分の感想を残す

この感想は、サイトに公開されることはなく自分にしか見えません。自分の考えのログを残すために感じたことを登録し、のこしておきましょう。あとで振り返ったときに、あのとき自分はこう考えていたのかということを知ることにより、あなたの成長へとつながります。

Githubでログイン

Githubアカウントでかんたんにログインして、DevTabをもっと便利に使おう。

  • ひとつ前の記事

    ギルドワークスの合宿、4つの種類

  • ひとつ後の記事

    AWS Amplify を利用して最速で会員登録をつくる

この記事もどうですか?

クラス名の探し方

ギルドワークスの増田です。 最近、ある分野(株価)に特化した SNS サービスのドメインモデルを設計…

つくる

2016.10.31

ポイント
1

Amazon S3を利用して超低額でサイトを公開(設定編)

上野です。 Amazon S3を利用して超低額でサイトを公開する でS3でコーポレートサイトを公開す…

つくる

2016.11.21

ポイント
0

「正しいものを正しくつくる」ための考え方・道具を整理してみた

ギルドワークスの佐々木です。 私は、2010年度に産業技術大学院大学の履修証明プログラム「人間中心デ…

つくる

2016.11.15

ポイント
1

シェア
  • Twitter
  • このエントリーをはてなブックマークに追加
  • Google Plus

ログインして
ブックマーク

  • Twitter
  • このエントリーをはてなブックマークに追加
  • Google Plus
  • ログイン
LINE@

新しい記事が出たときや、注目の記事などを
定期的にLINEでお知らせしていきます

LINEで登録

LINEイメージ

DevTab
成長しつづけるデベロッパーのための情報タブロイド

株式会社ギルドワークス
https://guildworks.jp
  • プライバシーポリシー
  • お問い合わせ

Copyright © GuildWorks Inc. All Rights Reserved.

ページのトップへ