Ruby on Railsアプリケーションを開発していると、グローバルで有効な定数を定義することがよくありますよね。そんなときに便利なgemを開発しました。名前はConstantinopolis(コンスタンティノーポリス)です。内容としては・・ええ、明らかにsettingslogicにインスパイアされました。
Constantinopolis
- github – https://github.com/itmammoth/constantinopolis
- rubygems – https://rubygems.org/gems/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 %>
当画面にブラウザでアクセスしてみると・・・
ナイスですね!
是非ともご近所お誘い合わせの上、使ってみてくださいませ! ツッコミ・フォーク大歓迎です。
関連する記事
- 久しぶりにRailsで開発して感じたこと
- rails_sortableでマスタをラクラク並び替え
- Railsアプリを『浅く』パフォーマンス・チューニングしてみる(その1)
- rubocop + pre-commitで規約違反のコードをコミットできないようにする
- Rails+JSフレームワークでリアルタイム掲示板を作成してみる(AngularJS編)