joppot

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

プログラミング

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

投稿日:


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

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

関連記事

ruby on railsのckeditorの画像のアップロード先をcarrierwaveとfogを使ってS3にする

概要 railsのckeditorはデフォルトでrailsのuploadsフォルダにアップロードしますが、 それだとサーバの容量を取ってしまうので、画像のアップロード先をS3に上げてみたいと思います。 …

Hiragino Sansフォントウェイトのcss書き方まとめ

概要 みなさんこんにちはcandleです。今回はHiragino Sansのcssの書き方を紹介します。 Hiragino Sansの特徴はフォントの太さを1から9段階まで変えられることです。 一方で …

MAMP2.2上でのPHP5.3.27のpearの使い方と動作確認

概要 みなさんこんにちはcandleです。今回はMAMPのpearの使い方と動作確認です。 pearというのはphpのライブラリ群の様なもので、便利なライブラリがそろっています。 中にはなぜ、これがp …

gemspecのsummary項目とdescription項目の違いに付いて

概要 みなさんこんにちはcandleです。 gemを自作していたら、gemspecのところでsummaryとdescriptionの違いが分からなかったので、 調べたら、公式ページに書いてあったので、 …

React WebでURLをaタグのリンクにして表示する

概要 みなさんこんにちはcandleです。今回はReactでコメントなどに投稿されたURLからリンクを生成する方法を紹介します。しかし、URLからリンクの自動生成は結構危険です。無尽蔵にリンク化を許可 …

  • English
  • 日本語

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