joppot

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

プログラミング

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

投稿日:

Pocket

logo

概要

みなさんこんにちはcandleです。今回は前回に引き続き、gemの作成をやっていきます。
gemのconfigとは恐らく一般的に以下の様な状況の時に使う事になると思います。
例えば、gemのプログラム上、デフォルトの値があるけれども、場合によってはrailsアプリケーションで自由に設定できるなどの場合です。

configはgemの中に初期の値が設定されており、もしも、railsアプリケーションの中にそのgemのconfigファイルが作成されていなければ、そちらを参照し、もしも、configファイルがrails
アプリケーションの中にあれば、そちらを参照する様に作ります。

feawfee


前提


configファイルを作成する

なんども、記述しますが、gemの記述はこれといった決まった書き方があるわけではなく、開発者それぞれなのです。が、ここで紹介するはその1つだと思ってください。

configファイルは一般に以下に作成します。

lib/gem名/config.rb

です。

このシリーズのサンプルgemなら以下の様になります。

lib/good_item/config.rb

09jfa

config.には以下の記述をします。

module gem名
  class Config
    attr_accessor 扱いたい値をシンボルで記述

    def initialize
      @扱いたい値 = デフォルト値
    end

  end
end

サンプルでは以下の様にして、色を設定します。

module GoodItem
  class Config
    attr_accessor :color

    def initialize
      @color = "blue"
    end

  end
end

feawijfea

これで設定は良いでしょう。

初期設定ではcolorはblueと設定しました。

適当なcontroller helperを作る

設定で記述した事を使う為に、サンプルのcontroller helperを作りましょう。
この記事ではcontroller helperの説明では無いので、細かい所は省きます。

lib/good_item/helper.rb

を作成して、module GoodItemのmodule Helperの中に
以下の関数を作成します。

module GoodItem
  module Helper
    def cputs(val)
      if GoodItem.config.color == "blue"
        puts "\e[34m"+val.inspect+"\e[0m"
      elsif  GoodItem.config.color == "red"
        puts "\e[31m"+val.inspect+"\e[0m"
      end
    end
  end
end

shaekf

これで適当なconfigの値を使ったヘルパーが出来ました。

GoodItem.config.color
というのがconfigで設定された値です。


engineに設定を書き込む

configとhelperは書いただけではrailsでは使用できません。
そこで、gemを使用する為にengineに設定を記述します。

engine.rbにconfig.rbの設定を記述します。

一般に以下の様に書きます。

require 'gem名/config'
module gem名
  def self.config
    @config ||= gem名::Config.new
  end

  def self.configure(&block)
    yield(config) if block_given?
  end

  class Engine < ::Rails::Engine
    isolate_namespace gem名
  end
end

サンプルでは以下の様に書きます。

require 'good_item/config'
module GoodItem
  def self.config
    @config ||= GoodItem::Config.new
  end

  def self.configure(&block)
    yield(config) if block_given?
  end

  class Engine < ::Rails::Engine
    isolate_namespace GoodItem
  end
end

goiofeaff

require ‘good_item/config’

でconfig.rbを呼び出します。

def self.config
@config ||= GoodItem::Config.new
end

self.config関数は「Gem名.config.任意の変数」を参照できる様にする為の関数です。

サンプルで作成したcolorを参照するなら「GoodItem.config.color」で値を参照できます。

def self.configure(&block)
yield(config) if block_given?
end

self.configure関数はrailsアプリケーションのconfig/initializerフォルダの中でgemの中で定義されたconfig.rbを上書きする時に使用する関数です。こうする事で、gemの中のcolorの変数をrailsアプリケーションの中で変更する事が可能になります。

先ほど作成したcontroller helperの設定は以下の様になります。
詳しい事は以下の記事を参照してください。

require 'good_item/config'
require 'good_item/helper'

module GoodItem
  def self.config
    @config ||= GoodItem::Config.new
  end

  def self.configure(&block)
    yield(config) if block_given?
  end

  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

gemoieajf

以上で、gemの設定は終わりました。

railsアプリケーション上で動かす

予め、作成したgemを読み込んだrailsアプリケーションを用意します。

私はposts controllerにscaffoldがあるので、indexアクションで作成したcontroller helperのcputsを使ってみます。

feoo

railsを起動して、サイトにアクセスするとログに青色のputs出力がでます。

blueputs

上手く動作していますね。


railsアプリケーション側でgemのconfigを設定する

さて、初期設定のblueは表示出来ましたが、それだけだと拡張性が無いので、不便です。
railsアプリケーション側でcolorの色を設定して、任意の色が表示できると便利ですよね。
今回作成したcputs関数の中ではblueとredしか色対応してないので、redをrailsアプリケーション側で設定していみましょう。

railsアプリケーションのconfig/initializersフォルダの中に以下のファイルを作ります。
ファイル名は一般に「そのgem名.rb」にします。

本来、gemの設定ファイルはgemの generatorを使用してrailsアプリケーションに用意するのですが、それは次回以降解説します。

私はgemlibというrailsアプリケーションにサンプルのgood_item gemのconfigファイルを作成します。

touch config/initializers/good_item.rb

creategooditemconfig

一般に設定ファイルの書き方は以下の様にします。

Gem名.configure do |config|
  config.変数名 = 任意の値
end

例えば、今回のサンプルの場合は以下の様に記述します。
color変数を上書きしたいので以下の様にします。

GoodItem.configure do |config|
  config.color = "red"
end

colorconfig

ここで使われているconfigure関数はgemのengine.rbで定義したself.configure関数を使っています。

上手く行っていれば、これでcputsの出力結果が赤になります。
サーバを再起動して、アクセスしてみると、ログの色が赤になっています。

redputs

まとめ

configの使い方の基本的なところをやりました。いかがでしたでしょうか。
configは慣れると簡単ですが、慣れないと難しいですよね。
この記事を機会に試してみましょう。

スポンサードリンク

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

-プログラミング
-,

執筆者:


comment

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

関連記事

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

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

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

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

正規表現を極めるその1

概要 みなさんこんにちはcandleです。今回から正規表現を1から100まで極めようと思います。 正規表現って、使えると便利ですが、それを勉強して使いこなせている人って少ないと思います。この機会にぜひ …

ruby on railsのgemのインストールで不要なファイルをインストールしない設定

概要 みなさんこんにちはcandleです。私の記事はどうしても先人のプログラマーがまとめた内容を追試しているような感じになっていますが、これも重要なことなので、忘れないためにもまとめておきます。 ru …

railsのscaffoldでremote formを使ってフォームの送信をajax化する

概要 みなさんこんにちはcandleです。 今回はrailsのformをremoteを使ってajaxしたいとおもいます。 正直、解説するまでもなく簡単です。 前提 適当なrailsプロジェクトが存在す …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ