概要
みなさんこんにちはcandleです。今回は前回に引き続き、gemの作成をやっていきます。
gemのconfigとは恐らく一般的に以下の様な状況の時に使う事になると思います。
例えば、gemのプログラム上、デフォルトの値があるけれども、場合によってはrailsアプリケーションで自由に設定できるなどの場合です。
configはgemの中に初期の値が設定されており、もしも、railsアプリケーションの中にそのgemのconfigファイルが作成されていなければ、そちらを参照し、もしも、configファイルがrails
アプリケーションの中にあれば、そちらを参照する様に作ります。
前提
configファイルを作成する
なんども、記述しますが、gemの記述はこれといった決まった書き方があるわけではなく、開発者それぞれなのです。が、ここで紹介するはその1つだと思ってください。
configファイルは一般に以下に作成します。
lib/gem名/config.rb
です。
このシリーズのサンプルgemなら以下の様になります。
lib/good_item/config.rb
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
これで設定は良いでしょう。
初期設定では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
これで適当な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
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
以上で、gemの設定は終わりました。
railsアプリケーション上で動かす
予め、作成したgemを読み込んだrailsアプリケーションを用意します。
私はposts controllerにscaffoldがあるので、indexアクションで作成したcontroller helperのcputsを使ってみます。
railsを起動して、サイトにアクセスするとログに青色のputs出力がでます。
上手く動作していますね。
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
一般に設定ファイルの書き方は以下の様にします。
Gem名.configure do |config| config.変数名 = 任意の値 end
例えば、今回のサンプルの場合は以下の様に記述します。
color変数を上書きしたいので以下の様にします。
GoodItem.configure do |config| config.color = "red" end
ここで使われているconfigure関数はgemのengine.rbで定義したself.configure関数を使っています。
上手く行っていれば、これでcputsの出力結果が赤になります。
サーバを再起動して、アクセスしてみると、ログの色が赤になっています。
まとめ
configの使い方の基本的なところをやりました。いかがでしたでしょうか。
configは慣れると簡単ですが、慣れないと難しいですよね。
この記事を機会に試してみましょう。