概要
みなさんこんにちはcandleです。今回はgemの中枢とも言えるhelperの作り方です。
helperというのは様はgemにすることで便利になる関数を作るとというイメージです。
例えば、controllerの中で使える便利な関数や、viewの中で使える描画など。
よくあるのが、こんな感じのviewヘルパーですね。
<%= render_user_info() %>
これらはlib/helperで作れます。
前提
このシリーズは以下の3つの記事からの続きです。gemの初期化などは前の記事で紹介しています。
Rails pluginを使ったgemの作り方[1](基本設定編)
Rails pluginを使ったgemの作り方[2](rails組み込み編)
Rails pluginを使ったgemの作り方[3](vendor/assets 読み込み編)
Rails pluginを使ったgemの作り方[4](controller helper編)
controller helperの作成
helperは厳密にはviewで動こうがcontrollerで動こうが、helperなのですが、ここでは明示的にcontrollerヘルパーとかviewヘルパーと言います。
今回はcontrollerヘルパーを作成します。
gemの作成方法はあまりにも多様で、紹介する方法が全てではなありませんが、1つの方法として紹介します。
helperは一般に以下の様に作成します。
lib/gem名/helper名.rb
例えば、こんな感じ。ヘルパーを1つしか作らないなら、大方この方法がベストだと思います。
lib/gem名/helper.rb
サンプルのgemでいうと以下の様にします。
cd lib/good_item touch helper.rb
次にhelperの一般的な記述です。
module gem名 module 作成したhelperファイル名 def 関数名 end …… … end end
「gem名」はキャメルケイスで記述します。この辺が妙にちゃんとしてないとだめです。
「作成したhelperファイル名」は今作成したhelper.rbを指しています。キャメルケイスで記述します。
もしも、作成した、ヘルパーファイルがgood_helper.rbなら、GoodHelperになります。
関数は幾らでも作ってください。
今回のサンプルの場合は以下の様になります。
module GoodItem module Helper def logi(value) logger.debug("===============================") logger.debug(value.inspect) logger.debug("===============================") end end end
logiという関数を作りました。
デバッグ様のツールですね。
これで、ヘルパーが完成しました。
engineでhelperの設定
ここから、gemならではの書き方です。
私はgemにもrubyにも精通しているわけではないので、ここで苦労しました。
自分みたいなコピペプログラマはrailsがどこまで自動的に動くのかよくわかっていません。
ただ1つ、gemのhelperは次の様に設定しないとrailsで呼び込まれません。
やってきましょう。
helperの設定は以下のengine.rbに記述します。
lib/gem名/engine.rb
サンプルの場合ですと、
lib/good_item/engine.rb
ですね。
それを開いて、以下の様に記述します。
require 'good_item/helper' module GoodItem class Engine < ::Rails::Engine isolate_namespace GoodItem initializer 'good_item.action_controller_helpers' do ActiveSupport.on_load :action_controller do include GoodItem::Helper end end end end
require ‘good_item/helper’
は作成したhelper.rbのファイルを呼び出しています。ファイル名が変わればそれに応じて「/helper」の部分が変わります。
isolate_namespace GoodItem
は、今の所、自分は分かりません。合っても無くても動きます。
initializer ‘good_item.action_controller_helpers’ do
このinitializarの記述はわりと適当です。gem名.action_controller_helperです。
controllerに関するヘルパーだからaction_controller_helperです。
ActiveSupport.on_load :action_controller do
include GoodItem::Helper
include GoodItem::Helperは一般的に書けば「Gem名::ヘルパー名」です。故に、good_helper.rbというファイル名でヘルパーを作ったら、「GoodItem::GoodHelper」になります。
以上で設定は終わりです。これで作成したhelperであるlogi関数が使える様になりました。
railsアプリケーションで使ってみる
予めgood_item gemを読み込んだrailsアプリケーションで、適当なコントローラーでlogi関数を使います。
私はposts_controllerがあるので、そのindexアクションで使ってみます。
railsのlogを見てみると、作成したlogi関数実行されています。
まとめ
という感じで、簡単なcontrollerのヘルパーを作成しました。
次回はviewのヘルパーを作ってみます。