Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rails 4.2のあまり知られていない便利機能 ― config_forからbin/setupまで

先週、Rails 4.2の最初のベータ版が発表されました。ActiveJob、Web Console、Adequate Record、そして外部キー(Foreign Key)サポートなど、注目の機能が盛りだくさんで、早く自分のアプリでも試してみたいところです。

しかし、Railsの本当の魅力は細部にこそあります。少し掘り下げてみると、あまり宣伝されていないものの、日々の開発を大きく改善してくれる隠れた機能がいくつも見つかるはずです。

設定ファイルを簡単に読み込める「config_for」

筆者の好みが入っているかもしれませんが、設定ファイルを読み込む仕組みがフレームワークに標準で組み込まれるのは、非常にありがたいことです。

Rails 4.2で新たに追加されたconfig_forは、まさに期待どおりの挙動をしてくれます。

config/redis.yml
development:
  host: localhost
  port: 6379
test:
  host: localhost
  port: 6379
production:
  host: redis-production
  port: 6379
irb(main):001:0> Rails.application.config_for(:redis)
=> {"host"=>"localhost", "port"=>6379}

つまり、config_for(:redis)を呼び出すと、アプリ内のconfig/redis.ymlを探して解析し、現在のRAILS_ENVに対応した設定値を自動的に返してくれるのです。

さらに、YAMLの中にERBを埋め込むことさえ可能です。

config/redis.yml
development:
  host: localhost
  port: <%= ENV['REDIS_PORT'] %>
test:
  host: localhost
  port: <%= ENV['REDIS_PORT'] %>
production:
  host: redis-production
  port: <%= ENV['REDIS_PORT'] %>
$ REDIS_PORT=6380 bin/rails c
Loading development environment (Rails 4.2.0.beta1)
irb(main):001:0>  Rails.application.config_for(:redis)
=> {"host"=>"localhost", "port"=>6380}

RedisやSidekiqなど、複数のサービスを利用するアプリでは、イニシャライザのコードが格段に読みやすくなるでしょう。

アプリの初期セットアップを「bin/setup」で統一

ほとんどのRailsアプリは、動作確認の前に何らかのコマンドを実行する必要があります。中身がほとんど空のアプリであっても、起動前のデータベースセットアップは欠かせません。

そこでRailsは、「設定より規約(Convention over Configuration)」の精神にもとづき、セットアップコード専用の場所としてbin/setupを用意しました。

デフォルトの内容だけでも十分実用的ですが、bin/setupにはアプリの起動に必要なその他のコードも自由に追記できます。

これが新しい規約となった今、すでに独自のブートストラップスクリプトを書いているなら、名前をbin/setupに変更しておきましょう。そうすれば、あなたのアプリを利用する開発者がスムーズに環境構築を始められます。

bin/setupのおかげで、新規アプリ生成時の判断がひとつ減ります。また、git pullのあとにbin/setupを実行する習慣をつければ、rake db:setupの実行を忘れることもなくなるでしょう。

ハッシュの値を一括変換する「transform_values」

これも頻繁に必要になる処理なので、Ruby本体に組み込まれていてほしい機能のひとつです。ハッシュに対してtransform_valuesを呼び出すと、値に対してmapを実行したような動作になり、元のキーと変換後の値を持つ新しいハッシュを返します。

h = {a: 1, b: 2, c: 3}

h.transform_values { |v| v * 2 } # => {a: 2, b: 4, c: 6}

ごくシンプルな機能ですが、実際に使ってみると、その出番の多さに驚かされるはずです。

おまけ:もっと柔軟になったカスタム設定

Rails 4.2では、独自のグローバル設定を簡単に定義できるようになりました。

Rails.application.config.x.some_configuration_key = "Some Value"

Rails.application.config.x.some_configuration_key # => "Some Value"
Rails.configuration.x.some_configuration_key # => "Some Value"

この機能は、config_forと組み合わせると特に効果を発揮します。

app_config = Rails.application.config_for(:app)
Rails.application.config.x.block_phone_calls = app_config["block_phone_calls"]

まだまだある隠れた改良

Rails 4.2は、素晴らしいリリースになることが予想されます。しかし、日々のRails開発を快適にしてくれるのは、こうした小さな改良の積み重ねなのです。まだの方は、ぜひ一度4.2のリリースノートに目を通して、他にも役立つ改善点がないか探してみてください。

(もし面白い機能を見つけたら、ひとりで秘蔵せずにぜひシェアしてください。みんなで新しい発見を共有しましょう!)

  1. Androidで使えるGoogleアシスタントの便利な機能まとめ

    スマートアシスタントの世界には、Alexa、Siri、Cortanaといった強力なライバルがひしめき合っています。その中でGoogleが送り出したのが「Googleアシスタント」です。その名の通りGoogleが開発したアシスタントで、高い検索能力と自然な会話力によって、他のライバルを大きく引き離す存在となっています。Googleアシスタントは2016年5月のGoogle I/Oで初めて発表され、当初はPixelやPixel XLなど一部の端末でのみ利用可能でした。しかし現在では、さまざまなAndroidスマートフォンに搭載され、誰でも手軽に使えるようになっています。ここでは、Googleアシス

  2. ガジェット持ち運びに最適なテック対応バックパック5選

    テクノロジー機器を持ち歩いて旅をする人なら、普通のバックパックに荷物を詰め込むときのもどかしさを経験したことがあるはずです。メモリーカードのような小さなものはバッグの中で行方不明になりがちですし、高価な電子機器は傷ついたり故障したりする心配もつきもの。幸い、電子機器をしっかり守りながら快適に移動する方法があります。 1. Lifepack ソーラー充電式&防犯バックパック Solgaard社のLifepackは、単にテクノロジー機器を収納するだけでなく、それ自体が一つのテクノロジーと言えるバックパックです。通常のバックパックにはないハイテク機能を多数搭載しています。まず、内蔵モバイルバッテリ