Rails開発を面白くするアクションコントローラーの5大機能とルーティングの基本:開発現場でちゃんと使えるRails 4入門(7)(3/3 ページ)
エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、MVCモデルにおける「C」の部分をつかさどるActionControllerの主な機能とアクションとパスの対応を定義するルーティングなどについて解説します。
【5】「ファイルとデータの送信」機能
ビューをレンダリングしてレスポンスする以外にも、ファイルやデータを送信する機能もActionControllerには用意されています。
ファイルの送信
既存のファイルをダウンロードさせるには「send_file」メソッドを使います。
def book_pdf @book = Book.find(params[:id]) send_file @book.pdf_path, filename: @book.title, type: ‘application/pdf’ disposition: ‘inline’ end
「send_file」の引数にはファイルが存在しているパスを渡します。オプションでファイル名(filename)やHTTPレスポンスヘッダーのContent-Type属性(type、デフォルト:application/octet-stream)、Content-Disposition属性(disposition、デフォルト:attachment)を指定できます。
データの送信
既存のファイルではなくバイナリデータを送信する場合は「send_data」メソッドを使います。使い方は引数に送信するデータ自身を取り、オプションは「send_file」と同じです。
def book_pdf @book = Book.find(params[:id]) send_data @book.body, filename: @book.title, type: ‘application/text’ end
アクションとパスの対応を定義する「ルーティング」
これまでもルーティングは「config/routes.rb」で定義してきましたが、ここではより詳しく紹介します。
リソースへのルーティング
RailsはHTTPメソッド(GET、POST、PATCH(PUT)、DELETE)を適切に使い分けてリソースのCRUD(作成、読み込み、更新、削除)機能を実装するRESTfulな設計を標準としています。そのため、ルーティングでは「resources」一行を宣言するだけで引数にとったリソースのCRUD機能に必要な「index」「show」「new」「create」「edit」「update」「destroy」アクションとパスの対応が定義されます。
resources :books # rake routes コマンドの実行結果 books GET /books(.:format) books#index POST /books(.:format) books#create new_book GET /books/new(.:format) books#new edit_book GET /books/:id/edit(.:format) books#edit book GET /books/:id(.:format) books#show PATCH /books/:id(.:format) books#update PUT /books/:id(.:format) books#update DELETE /books/:id(.:format) books#destroy
「only」オプションや「except」オプションを使うことで、これらのルーティングを指定したり制限したりすることができます。
resources :books, only: %i(index) resources :users, except: %i(index new create edit update destroy) # rake routes コマンドの実行結果 books GET /books(.:format) books#index user GET /users/:id(.:format) users#show
また「resources」はブロックを取ることができ、その中で標準ではないアクションや従属するリソースへのルーティングを定義できます。
resources :users, except: %i(index new create edit update destroy) do get ‘booking’, on: :collection post 'message', on: :member resources :books, only: %i(index) end # rake routes コマンドの実行結果 booking_users GET /users/booking(.:format) users#booking message_user POST /users/:id/message(.:format) users#message user_books GET /users/:user_id/books(.:format) books#index user GET /users/:id(.:format) users#show
「resources」のブロック内で宣言されている「get」メソッドと「post」メソッドは、おさらいで紹介したそれらとは異なり、引数にアクション名をとります。また、そのアクションが特定のレコードを対象としているか、そうでないかを示す「on」オプションも渡しています。デフォルトでは「:member」をとります。
さらに、この特定のレコードを対象しているかどうかについて、「collection」メソッドまたは「member」メソッドに渡すブロックの中で「on」オプションなしで「get」メソッドなどを定義することもできます。
resources :users, except: %i(index new create edit update destroy) do collection do get ‘booking’ end member do post 'message', on: :member end resources :books, only: %i(index) end
これによるルーティングは一つ前と同じものが定義されます。
名前空間付きルーティング
ルーティングの定義に名前空間を付けることができます。
namespace :admin do resources :books end # rake routes コマンドの実行結果 admin_books GET /admin/books(.:format) admin/books#index (以下略)
このとき「app/controllers/admin/books_controller.rb」の「Admin::BooksController」がコントローラーとして呼び出されます。管理画面などを作りたいときは名前空間をこのように分けるとよいでしょう。
ルートの設定
アプリケーションのURLのルートや、名前空間のルートにリクエストがあったときに対応するアクションを定義するには、次のように宣言します。
root “books#index”
コントローラーとルーティングはアプリの設計には必須の知識
今回はコントローラーをつかさどる「ActionController」の機能とルーティングについて解説してきました。
この領域は筆者が初心者のころ、アクション間でデータを渡せないことなどを勘違いして非常に苦しんだ領域でした。あるとき、ルーティング自体にアクションの処理をブロックで渡す、Railsとは別のフレームワーク「Sinatra」を知り、そこで「Railsの仕組みもほとんど同様なのだ」と理解できてからは面白いようにRailsの設計が簡単になりました。
コントローラーとルーティングはアプリの設計には必須の知識です。ぜひ、たくさん作って経験を蓄えてください。
次回はビューをつかさどるActionViewについて解説していきます。
- Railsアプリの設計をMVCごとに見直しリファクタリングして連載総まとめ
- 「設定より規約」のRailsで必要なセッティングの基礎知識と国際化/多言語対応
- ActionMailerのSMTP設定、テンプレートで送信&ActiveModelの基本的な使い方とバリデーション
- RailsテストフレームワークRSpecのインストールと基本的な使い方、基礎文法
- RailsのテンプレートエンジンSlimの書き方とActionViewのヘルパーメソッド、レイアウトの使い方
- Rails開発を面白くするアクションコントローラーの5大機能とルーティングの基本
- ActiveRecordにおけるモデルの「関連」とコールバックの使い方
- ActiveRecordの基本機能とマイグレーション、バリデーション
- 現場で使えるか見極めたいRails 4.1の新機能8選
- 特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法
- scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する
- 簡単インストールから始める初心者のためのRuby on Railsチュートリアル
著者プロフィール
林 慶(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.
関連記事
- Railsで目指せ、情熱エンジニア(9):Railsのコントローラをテストする
前回はインテグレーションテストとしてCucumberでテストを作成しました。今回はユニットテストとして、RSpecを使ってコントローラのテストを作成します - Railsで目指せ、情熱エンジニア(10):コントローラとモデルをリファクタリングする
前回用意したRailsアプリのコントローラのテスト(スペック)をもとに、今回はコントローラとモデルのリファクタリングの実例を紹介します。 - 3rdRailによるRailsプログラミング入門(5):RailsアプリにおけるControllerの位置付け
今回からControllerクラスの開発ステップを紹介する。Controllerクラスの役割とは何だろうか - 資格試験は転職に役立つか:Rails技術認定試験がスタート、合格者に聞いた
- @IT自分戦略研究所 資格辞典:Rails技術者認定試験(Rails 3 Certified Programmer)