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

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

関連記事

phpとmysqlでアカウント管理する時のテストユーザーのパスワードの暗号化はmysqlのsha1でもできる

by brewbooks 概要 みなさんこんにちはcandleです。最近はphpでサービスを書いたりしています。その中でテストユーザーのアカウント管理でパスワードを暗号化してデータベースに収めています …

sphinxでpythonのクラスや関数のドキュメントを自動生成する

概要 みなさんこんにちはcandleです。今回はpythonのSphinxを使ってクラスや関数の説明を自動生成します。 前提 Python3を使って説明しますが、おそらくpython2でも動くと思いま …

railsのwebrickでi18nの言語切り分けをサブドメインで設定する

概要 みなさんこんにちはcandleです。最近では海外展開も視野に入れたwebアプリケーションの開発が行われることが多くなってきているような気がします。 そうなってくると、webアプリケーションの国際 …

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

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

railsのrakeのmigrationファイルを削除しNO FILEとstatusに出た時の対処

概要 みなさんこんにちはcandleです。今回は誤ってデータベースに反映したマイグレーションファイルを不要だと思って削除した時に、NO FILEと出てきてしまった時の対処です。 言うなれば、下のような …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ