Railsアプリ内の定数を管理するgem ‘Constantinopolis’


Ruby on Railsアプリケーションを開発していると、グローバルで有効な定数を定義することがよくありますよね。そんなときに便利なgemを開発しました。名前はConstantinopolis(コンスタンティノーポリス)です。内容としては・・ええ、明らかにsettingslogicにインスパイアされました。

Constantinopolis

Constantinopolisの大きな特長は、Javascript内でも定義した定数にアクセスできるという点です。使用方法などはGithubを見てもらえれば分かるかと思いますが、私は常にキャッチャーな人間でありたいため、Railsに導入する方法を日本語でもご紹介しておきます。

インストール

Gemfile に以下の行を記入します。(Bundler使ってますよね・・・?)

📄Gemfile
gem 'constantinopolis'

そしてインストール。

📄config/initializers/constantinopolis.rb
bundle install

使用方法

まず、ご自身の定数クラスを定義する必要があります。config/initializers 内に任意のrbファイルを作成します。今回はconstantinopolis.rb という名前にでもしておきましょう。

class Istanbul < Constantinopolis::Fort  # 継承必須
  yml "#{Rails.root}/config/istanbul.yml"  # 定数を定義するyamlファイルへのパス
  namespace Rails.env  # 名前空間 (必要なら).
end
Istanbul.build!  # 最後に忘れずにこれ!

次に、指定したパスに定数用yamlファイルを作成します。ERB記述OKです。また、値をネストして定義することも可能です。

📄config/istanbul.yml
defaults: &defaults
  common: Common value

development:  # 名前空間
  <<: *defaults
  greeting: Hello, development!
  number: 1
  memorable_date: <%= Date.today %>  # ERB使用OK
  is:
    located: Turkey  # ネストした値

test:
  <<: *defaults
  greeting: Hello, test!
  number: 2
  memorable_date: <%= Date.today + 1 %>
  is:
    located: Turkey

production:
  <<: *defaults
  greeting: Hello, production!
  number: 3
  memorable_date: <%= Date.today + 2 %>
  is:
    located: Turkey

これにて設定完了です。Rails内の至るところからこの定数にアクセスできます。

以下はビューからアクセスする場合のサンプルコードです。Javascriptからアクセスするためには、1行目の通り<%= javascript_tag 定数クラス.js_code %> ヘルパーを呼び出しておく必要があります。(しょっちゅうアクセスするのであれば、app/views/layouts/application.html.erb で呼び出しておけば良いかと思います)

📄index.html.erb
<%= javascript_tag Istanbul.js_code  %><!-- Javascriptからアクセスする際に必要! -->

<h1>Ruby context</h1>
<p><%= Istanbul.common %></p>
<p><%= Istanbul.greeting %></p>
<p><%= Istanbul.number %></p>
<p><%= Istanbul.memorable_date %></p>
<p><%= Istanbul.is.located %></p>

<h1>Javascript context</h1>
<p id="common"></p>
<p id="greeting"></p>
<p id="number"></p>
<p id="memorable_date"></p>
<p id="is-located"></p>

<%= javascript_tag do %>
  document.getElementById("common").innerText = Istanbul.common;
  document.getElementById("greeting").innerText = Istanbul.greeting;
  document.getElementById("number").innerText = Istanbul.number;
  document.getElementById("memorable_date").innerText = Istanbul.memorable_date;
  document.getElementById("is-located").innerText = Istanbul.is.located;
<% end %>

当画面にブラウザでアクセスしてみると・・・

index

ナイスですね!

是非ともご近所お誘い合わせの上、使ってみてくださいませ! ツッコミ・フォーク大歓迎です。

関連する記事