
みなさん、こんにちは。
前回のコラムで、資格試験のお話を少しさせていただきましたが、今回は、ちょっと具体的にRailsの資格試験の範囲から、Railsにはこんな機能やメソッド、ライブラリがあるのか・・・というもの(ちょっとマニアックなもの?)をいくつかピックアップしてご紹介していきたいと思います。あまり普段Railsをまだ使っていない方はもちろん、Railsをそれなりに使っている方でも、え?そんなのあるの?と思ってもらえるようなものが、もしかたらあるかもしれませんよ。
なお、下記の内容については、Rails4技術者認定シルバー試験の認定教材である「徹底攻略Rails4技術者認定シルバー試験問題集」「Railsガイド」を参考にしています。資格試験はRails4をベースにしていますが、以下で紹介する内容については、Rails5でも利用できますのでご安心ください。また「Railsガイド」については現時点でRails5に対応しています。Rails技術者認定の各種試験の認定教材の紹介については、以下URLも参考にしてください。
参考URL
一般社団法人Rails技術者認定試験運営委員会
(1)Railsで独自に追加されるメソッドの例「cattr_accessor」
Rubyで組み込みのメソッドとして用意されている「attr_accessor」は、ご存知の方が多いと思います。いわゆる、アクセサメソッドを動的に簡単に追加してくれるメソッドですね。
実は、RailsのActive Suport Core Extensionsでは、これに加えて「cattr_accessor」(mattr_accessorというメソッドのエイリアス)というメソッドを提供しています。
いったい、attr_accessorと何が違うのでしょうか。
実は、attr_accessorはいわゆるインスタンス変数に対するアクセサメソッドを追加するものなのですが、cattr_accessorはクラス変数に対するアクセサメソッドを追加してくれます。しかも、ブロックをつけるとブロックの評価結果を初期値として代入してくれるようにもなっているという、なかなか便利なメソッドになっています。
(2)ActiveRecordの集計用メソッド
データベースのデータを取り扱うとき、割と多い用途として、集計の用途があります。いわゆるSQL記述をベースとした仕組みの場合、SQL文であらかじめ集計関数を記述しておいて集計などを行うことが考えられますが、RailsのActiveRecordは基本的にSQLのコードに頼らずにプログラムを書きますので、こういった集計関数の代わりになるメソッドとして、「count」「sum」「average」「maximum」「minimum」といったメソッドが用意されています。
たとえば、「Employee」というモデルに対して、「salary」カラムの平均値を求めたいときは、
Employee.average(“salary”)
のように簡単に記述することができます。これらは、割と利用頻度が高い機能でもあるので、ご存知の方も多かったかもしれないですね。でも入門書や入門研修なんかですと、ここまで紹介されない場合もあるかもしれないなあと思ってご紹介してしまいました。
(3)ルーティングにおけるresourceメソッド
config/routes.rbに記述することのできるルーティング定義メソッドの「resources」はRailsを使っている方であればほとんどの方がご存知ではないかと思います。
たとえば、
resources :employees
と記述すると、以下の7つのいわゆるRESTfulなルーティングが定義されます。
HTTPメソッド | URL | コントローラ#アクション |
GET | /employees | EmployeesController#index |
GET | /employees/new | EmployeesController#new |
POST | /employees | EmployeesController#create |
GET | /employees/:id | EmployeesController#show |
GET | /employees/:id/edit | EmployeesController#edit |
PATCH/PUT | /employees/:id | EmployeesController#update |
DELETE | /employees/:id | EmployeesController#destroy |
resourcesは、メソッド名が複数形であることからもわかるように、複数個のリソースを対象としたルーティング定義メソッドです。ですが、ここでご紹介するのは、「resource」メソッドで、おわかりのとおりメソッド名が単数形です。つまり、1つのリソースを対象としたルーティング定義メソッドなのです。もちろん、対象リソースが本当にただ1つしかないというのは、通常なかなか考えにくいですが、「現在ログインしているユーザ自身のログイン情報を操作する」というような場面では、わざわざリクエスト側でそのリソースのIDを指定しなくても、コントローラ側で対象リソースを一意に特定できる場合もあります。そういった場合に、resourceメソッドを使うとよりシンプルに不要なものを省いたルーティングを提供することができます。
たとえば、上記の例と同じように
resource :employee
と記述すると、以下の6つのいわゆるRESTfulなルーティングが定義されます。
HTTPメソッド | URL | コントローラ#アクション |
GET | /employee/new | EmployeesController#new |
POST | /employee | EmployeesController#create |
GET | /employee | EmployeesController#show |
GET | /employee/edit | EmployeesController#edit |
PATCH/PUT | /employee | EmployeesController#update |
DELETE | /employee | EmployeesController#destroy |
お分かりの通り、「GET /employees」がないのと、show/edit/update/destroyメソッドに対するURLにパスパラメータ「:id」が不要になっています。アクション側でリソースを1つに特定できるようなケースを想定しているので、IDが不要になるのですね。
面白いのはコントローラはEmployeeControllerのように単数形のクラスではなく、resourcesメソッドと同じ複数形のEmployeesControllerが割り当たっていることです。これは何を意味するかというと、今まで通りに複数リソース前提のルーティングも、単数リソース前提のルーティングも、同じコントローラで扱ってしまうことができるわけですね。resource/resources両方のルーティング定義メソッドを併用して、クライアントからは場面に応じてリクエストを使い分けてもらうようなこともできるわけです。
ちなみにこれは余談ですが、大変恥ずかしながら私はRailsシルバーの資格の勉強をするまではresourceメソッドの存在を知らなかったので、試験対策の模擬問題で「resource」メソッドの名前を見たときに、普通に「resources」の「s」をつけ忘れた誤植だろうと思ってしまいました(笑)。もしかしたら、今回のコラムを読んでいる方の中にも、そう思われた方がいらっしゃるかも?
ということで、今回はRailsの資格試験の範囲から、ちょっとマニアックな?メソッドをいくつかご紹介しました。次回も引き続いて、いくつか資格試験の範囲から面白い機能やメソッドを紹介してみたいと思いますので、お楽しみに。
以上