現場で使えるか見極めたいRails 4.1の新機能8選開発現場でちゃんと使えるRails 4入門(4)

エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。今回は、息抜きとして4.1の新機能を紹介。モデルで列挙型を簡単に扱えるEnumや新プリローダーSpringなど便利機能に加え、秘密鍵、署名付きトークン、CSRFプロテクションなどセキュリティ対策機能も紹介。

» 2014年05月16日 17時00分 公開
[著:林慶、監修:山根剛司株式会社アジャイルウェア]
「開発現場でちゃんと使えるRails 4入門」のインデックス

連載目次

 前回の「特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法」までで、Railsのscaffoldを自作する取り組みを進めて、その基本的な機能の実装が終わりました。

 今回は息抜きを兼ねて、2014年4月8日にリリースされたRails 4.1の新機能の中から主なものを8つ紹介します。

※編集部注

本連載はRuby on Rails 4の入門連載です。Rubyについて学びたい方は連載「若手エンジニア/初心者のためのRuby 2.1入門」をご覧ください。


【1】Railsの新しいプリローダー「Spring」

 Springは「rails server」「rails console」「rake」コマンドが速くなる、Railsの新しいプリローダーです。これまで開発者が追加する必要がありましたが、Rails 4.1で標準となりました。

 Springを使うには、以下のコマンドでspringを実行するための設定をします。

bundle exec spring binstub --all

 その後、コマンドの前にspringを付けて実行すると、高速に結果が得られるようになります。以下のコマンドで現在実行されているspringの状態を確認できます。

bundle exec rake -T
bundle exec spring status

【2】端末ごとにテンプレートを使い分けられる「Variants」

 Variantsは特定の端末などに向けて異なるテンプレートを使えるようにします。

 使い方はアクションの実行前フィルターを次のように定義します。

before_action :ios_variant
  
private
  
def ios_variant
  request.variant = :ios if request.user_agent =~ /iPad|iPhone/
end

 このようにvariantが設定されると、アクションでレンダリングされるビューに「app/views/books/index.html+ios.erb」など、ファイル名のフォーマット部にvariantを追記したものがあれば、iOSからのアクセスではそちらが選択されます。

【3】モデルで列挙型を簡単に扱える「Enum」

 Enumはモデルで列挙型を簡単に扱えるようにします。

def Task < ActiveRecord::Base
  enum status: {pending: 0, wip: 1, done: 2}
end

 整数型で用意したカラム(上記コード例では「status」)に対して、モデル中で上記コード例のように宣言することで使用できます。これにより、モデルオブジェクトで識別子の文字列(またはシンボル)の代入や参照、その識別子であるかの真偽値を求めるメソッドが使えるようになります。

task.status = :wip
task.status # => "wip"
task.wip?   # => true
task.done?  # => false

 データベース中の実際の値は、宣言時の識別子をキーとするハッシュの各値になりますが、ハッシュではなく識別子の文字列(またはシンボル)の配列でもよく、その場合は配列の添字がデータベースに保存されます。

 ちなみに、宣言にない識別子が代入された場合はエラーとなり、識別子に該当しない値が入っていた場合はnilが返るようになっています。

【4】メールの送信内容のプレビュー確認ができる「Mailer Preview」

 Mailer PreviewはRailsのメール機能において、これまで確認しにくかった送信内容の確認機能です。

 次のコマンドでメール機能のコンポーネントが生成されます。

rails g mailer news

 生成されたコンポーネントの中の「app/mailers/news.rb」に以下のようにdailyメソッドを追加します。

class News < ActionMailer::Base
  default from: "from@example.com"
  def daily(datetime)
    @delivered_at = datetime
    mail to: "to@example.com"
  end
end

 続けて「app/views/news/daily.text.erb」ファイルを以下のような内容で作ります。

Railsデイリーニュース
配信:<%= @delivered_at %>

 従来のメール機能はここまでで、確認するためには実際に送信してみる必要がありました。しかし、4.1からは「test/mailers/previews/news_preview.rb」というファイルで以下のようにメール機能を呼び出します。

def daily_news
  News.daily(DateTime.now)
end

 そして、「http://localhost:3000/rails/mailers/news/daily_news」にアクセスするとメールのプレビューが閲覧できます。

【5】秘密鍵をまとめておける「config/secrets.yml」

 アプリケーションの秘密鍵である「secret_key_base」は「config/initializers/secret_token.rb」が削除されて「config/secrets.yml」に場所を移しました。このファイルには、他のサービスのAPI用の秘密のアクセスキーなどをまとめておきます。

【6】署名付きトークンの生成と検証ができる「Message Verifiers」

 クッキーが改変されていないかのチェックなどの機能で用いられるMessage Verifiersが使えるようになりました。Message Verifiersは署名付きトークンの生成と検証ができ、セッションを使わないシーンなどで利用できます。

remember_me_verifier = Rails.application.message_verifier(:remember_me)
signed_token = remember_me_verifier.generate(token_object)
remember_me_verifier.verify(signed_token) # => token_object

【7】モデル内でより簡単にモジュールを定義できる「Module#concerning」

 Module#concerningはRails 4.0から導入された「concerns」ディレクトリに対する機能です。モデルの定義ファイル上で可読性を損ねず、一方でクラスから責務を分離したいときに、モデル内でより簡単にモジュールを定義できます。

 例えば、以下のようにモデル内で「CD::Shelf」モジュールを定義できます。

class CD < ActiveRecord::Base
  concerning :Shelf do
    def latest_inventory_count
      ...
    end
  end
end

【8】CSRFプロテクションの変更

 Rails 4.1からはJavaScriptのGETリクエストに対してもCSRF(クロスサイト・リクエスト・フォージェリ)プロテクションが有効となりました。これにより、XMLHttpリクエストのテストで「format: :js」を付けたgetメソッドやpostメソッドではエラーが発生するため、xhrメソッドを使うように変更する必要があります。

# get :index, format: :js
xhr :get, :index, format: :js
# post :create, format: :js
xhr :post, :create, format: :js

今後もRailsのバージョンアップは連載で追っていきます

 Rails 4.1では多くの変更がなされました。今回はまだ情報が少なく、メジャーな機能しか紹介できませんでしたが、連載を進める中で現場で使える便利な機能があれば紹介していきたいと思います。

 また本連載では、これまで4.0系で解説を進めてきましたが、今後バージョンアップがされいくのに合わせていき、バージョンによって使えない機能などがあれば、そのことを明示する形式で進めていきます。

 次回は、従来の連載に戻り、RailsのMVCモデルの「M」である「ActiveRecord」を使いこなせるように、詳細に解説します。

著者プロフィール

林 慶(Rails技術者認定シルバー試験問題作成者)

平成2年大阪生まれ。2006年から高専で情報工学を学んでいたが当時は所謂プログラミングができない工学生だった。卒業後、高専の専攻科に上がったもののマンネリ化したキャンパスライフに飽きたため休学して渡豪。そこでプログラミングに対するコンプレックスを克服するためにRuby on Railsなどでアプリケーションを作ることを覚える。

帰国後から現在までは復学し推薦システムに関する研究を行いながら、アジャイルウェアでRuby on Railsアプリケーションの開発業務に従事している。

好きなメソッドはinject。


監修者プロフィール

山根 剛司(Ruby業務開発歴7年)

兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。

2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。

2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。

Ruby関西所属。好きなメソッドはtap。

Twitter:@spring_kuma、Facebook:山根 剛司


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。