joppot

コピペで絶対動く。説明を妥協しない

プログラミング

Rails pluginを使ったgemの作り方[4](controller helper編)

投稿日:

Pocket

uf08eau

概要

みなさんこんにちは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

touchheleper

次に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という関数を作りました。
デバッグ様のツールですね。

logidef-1

これで、ヘルパーが完成しました。


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

railsenginesetting

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」になります。

railsenginesetting

以上で設定は終わりです。これで作成したhelperであるlogi関数が使える様になりました。


railsアプリケーションで使ってみる

予めgood_item gemを読み込んだrailsアプリケーションで、適当なコントローラーでlogi関数を使います。

私はposts_controllerがあるので、そのindexアクションで使ってみます。

indexactionlogi

railsのlogを見てみると、作成したlogi関数実行されています。

watchloge


まとめ

という感じで、簡単なcontrollerのヘルパーを作成しました。
次回はviewのヘルパーを作ってみます。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Railsの正規表現を使用して文字列から任意の文字を取得する

概要 みなさんこんにちはcandleです。今回はrailsの正規表現を使って任意の文字を文字列から取得する方法を紹介します。 rails4になってからなのか、railsはrubyであるにもかかわらず、 …

fluentdでrails logをtailで直接取得する方法

概要 追記) この記事はだいぶ古くなってしまったので、新しく書き直しました。 こちらの方を参照した方が多分良いことが書いてあります。 https://joppot.info/2017/03/17/35 …

fabricのsshのネットワーク設定でパスワードか公開鍵を使って認証する

概要 皆さん今日はcandleです。今回はsshを使ったfabricの設定をしましょう。 一般にsshにはパスワード認証と公開鍵認証があるので、そのどちらも試してみましょう。 もちろんセキュリティ面で …

ruby on rails4でtwitter bootstrap 3のgemを使用してscaffoldを作成する

概要 みなさんこんにちはcandleです。今回はrails4上でtwitterbootstrap3のgemを使ってscaffoldしてみたいと思います。 scaffoldとはご存知のようにいわゆるwe …

Rails pluginでengineを使ったgemの作り方[6](config編)

概要 みなさんこんにちはcandleです。今回は前回に引き続き、gemの作成をやっていきます。 gemのconfigとは恐らく一般的に以下の様な状況の時に使う事になると思います。 例えば、gemのプロ …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ