エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。今回は、息抜きとして4.1の新機能を紹介。モデルで列挙型を簡単に扱えるEnumや新プリローダーSpringなど便利機能に加え、秘密鍵、署名付きトークン、CSRFプロテクションなどセキュリティ対策機能も紹介。
前回の「特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法」までで、Railsのscaffoldを自作する取り組みを進めて、その基本的な機能の実装が終わりました。
今回は息抜きを兼ねて、2014年4月8日にリリースされたRails 4.1の新機能の中から主なものを8つ紹介します。
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
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からのアクセスではそちらが選択されます。
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が返るようになっています。
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」にアクセスするとメールのプレビューが閲覧できます。
アプリケーションの秘密鍵である「secret_key_base」は「config/initializers/secret_token.rb」が削除されて「config/secrets.yml」に場所を移しました。このファイルには、他のサービスのAPI用の秘密のアクセスキーなどをまとめておきます。
クッキーが改変されていないかのチェックなどの機能で用いられる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
Module#concerningはRails 4.0から導入された「concerns」ディレクトリに対する機能です。モデルの定義ファイル上で可読性を損ねず、一方でクラスから責務を分離したいときに、モデル内でより簡単にモジュールを定義できます。
例えば、以下のようにモデル内で「CD::Shelf」モジュールを定義できます。
class CD < ActiveRecord::Base concerning :Shelf do def latest_inventory_count ... end end end
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 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.