Rubyと仲良くなりたい٩( 'ω' )و

Rubyと仲良くなりたい日々のこと

ControllerとViewの共通処理をConcernに書いた話

はじめに

Concernという存在を知ったので、まとめました。

Concernとは

どういうものなのか

Ruby on RailsActiveSupport( Active Support Core Extensions )の一つです。

モジュールを利用してMix-inする時に、複雑なコードを書かなくていいようにしてくれて、モジュールの依存関係もいい感じに処理してくれる機能です。

Active Supportについて

Active Supportは、Ruby言語の拡張、ユーティリティ、その他横断的な機能を提供するRialsのコンポーネントです。

Ruby on Railsアプリケーションでは、(config で読み込まない設定をしていない限り)基本的にすべてのActive Supportを読み込みます。

どんな時に使われるのか

主には、MVCをまたいで共通した処理を利用したい場合に用いられます。 例えば、Viewでも使いたいけど、Controllerでも使いたいメソッドがある場合、
Viewだけならhelperに書けば良いし、ControllerだけならApplicationControllerに書けば良いのですが、
どちらでも使いたい場合、共通のモジュールとしてConcernに定義することが考えられます。

具体例

ViewでもControllerでも使いたいhugaというメソッドがある時の一例です。
helper methodとして使えるようにしています。

Concern

app/controllers/concerns/hoge.rb

# Hogeというmoduleを定義
module Hoge
  # ActiveSupportのConcernを取り込む
  extend ActiveSupport::Concern
  
  # includedに渡したブロックがmoduleのinclude先で利用出来るようにする
  included do
    # helper_methodにhugaを渡す
    helper_method :huga
  end
  
  # hugaメソッドを定義
  def huga
    @huga_huga = xxxxxxxxxxxx
  end
end

Controller

app/controllers/xxxx_controller.rb

class ApplicationController < ActionController::Base
  # Hogeモジュールを取り込む
  include Hoge
end

View

app/views/xxxx/index_html.haml

%p "#{@huga_huga}さん"

最後に

色々な歴史があってActive Supportに追加されたので、調べてみると古いコード例などもあり、どう書けば良いものか悩みました。
Ruby on Rails 5.2.0にも、こういう風に書かないといけないのをこう出来るんだよ、という風に書いてあったのが後々なるほど、となったので、リンクを載せておきます。

api.rubyonrails.org

Kernel偉大という話

Kernelとは

Kernelとは、核心・要点・中心部という意味合いを持つ言葉です。

RubyのKernelは、module Kernel (Ruby 2.5.0)によると、

全てのクラスから参照できるメソッドを定義しているモジュール。

です。

どういう意味?

まず、大事なこと。Kernelモジュールは、モジュールです(そのまんまですみません)。

『全てのクラスから参照できるメソッド』と言うのは、ObjectがKernelモジュールをincludeしていると言うことなのです。

下記の例で言うと、

a = "Hello!!"
a.class
=> String
a.class.sperclass
=> Object

aのクラスはStringです。
StringのスーパークラスがObjectです。
このObjectがKernelモジュールをincludeしているので、aがKernelモジュールを参照できます。

そして、Objectはすべてのクラスのスーパークラスです。
ObjectがKernelモジュールをincludeしているということは、Kernelモジューを『全てのクラスから参照できる』ということになるのです。

どんなのがあるの?

よく見かけるので、Array, Hash, Intege, binding, exit, raise, load, open, p, print, require, select...
書きかけましたが、キリがないので、詳細はこちらのドキュメントからどうぞ。

docs.ruby-lang.org

最後に

よくわからない感じになっていたのですが、先輩に手伝っていただき図に書いたりしながらやっとイメージがついたので要点をまとめました。 Kernel偉大…!

TokyuRuby会議12で初LTをしてきました

TokyuRuby会議

TokyuRuby会議は、Ruby関連のLT大会です。 美味しいものを飲み食いしながらLTを展開するわいわいした会です。 主催者が、この会は「Ruby好きなRubyistを愛でる花見」というようなことを仰っていて、なるほどその通り!と思いました。
普通のLT大会と違って、LT王と飯王の2種類の王が選ばれます。 サントリーさんがスポンサーとなってくださってからは、ビール飲み放題ということでも有名です。

TokyuRuby会議12 - Regional RubyKaigi

今年のTokyuRuby会議

今年は、VOYAGE GROUPさんのオフィスを提供いただき、ビールスポンサーのサントリーさん、コーヒースポンサーのツクルバさんにそれぞれ美味しいビール、美味しいコーヒーをご提供いただいていました。
昔は完全持ち込みで公民館みたいなところで開催してらしたとか。今では無限ビールで有名なLT大会になっていますが、これまでTokyuRuby会議を支えてくださったサントリーの方が今年定年退職されるとのことで花束を贈呈する一幕もあり、歴史を感じました。

初LTをしてきました

TokyuRuby会議は、エントリーのハードルがもっとも低いLT大会(でも王になるハードルは高い)と言われていたのでとりあえずとにかくエントリーしました。そして、去年のTokyuRuby会議に行ったおかげで今の私があるので、その内容を話したいと思い、「TokyuRuby会議行ったら人生変わったww」というタイトルで、表示を頑張りました。

f:id:Chinatz:20180730094926p:plain

よかった点

  • TokyuRuby会議が好きな常連さんが多いので、テーマが場に合っていた。
  • お酒のおかげもあって結構ウケて嬉しかった。
  • いい話!という感想をたくさんいただけて励みになった。
  • 5分いっぱい使って、伝えたかったところまでは全部言えた。
  • 某Asakusa勢の方が「ビール口に含んでるときに笑うスライド出さないでほしいw」と呟いていて嬉しかった笑。

残念だった点

  • 利根川さんに頼りすぎた感。
  • 最初1分ものすごく緊張して足の震えが止まらない。
  • スライドの話題に出させていただいた恩人にお会いできなかった。
  • LT王も自分でエントリーしないといけないことに気づいてなくて後半戦始まってからエントリーしたので、ナウで投票してもらうチャンスを逃していた。

LTをしてみて、大勢のRubyistの方達の前でLTをする、というハードルが若干下がった気がするのと、来年は技術系のお話でエントリーしてみたい(参加する気満々)というモチベーションになって、結果、やってみて本当によかったです。
LTよかった!とかアイコンと本人が一致した!とかで声をかけてくれる人も多くて、やって損することは何もないとも思いました。

当日スタッフもしてきました

運営スタッフではなく、当日のみお手伝いをする当日スタッフをしました。
ご飯周りの整理整頓のお手伝いをさせていただいたのですが、出し方にも工夫が必要でスタッフの人は細かいところをフォローしていらっしゃるのを知りました。
例えば、未開封のものや自分でパンに乗せないと食べられないなどの一手間必要なものは、全然手をつけられなかったり、奥の方に置いているものやパッと見で何なのかわからないものは声をかけないとなかなか手をつけられなかったりなので、運営側で食べてもらえるように配置、トッピング、声かけをしていました。
運営スタッフの方は来る人来る人に自然に声をかけて料理がはけていくのをサポートしていてさすが!と思いました。

当日スタッフをやってみて、これだけのイベントをスムーズに回していてしかも「無理しない」運営をしているのは、積み重ねてきたものや細かな気配りがあってのことだと感じました。
運営スタッフの皆様、本当にありがとうございます。