連載
» 2014年07月30日 18時00分 公開

開発現場でちゃんと使えるRails 4入門(7):Rails開発を面白くするアクションコントローラーの5大機能とルーティングの基本 (3/3)

[著:林慶、監修:山根剛司,株式会社アジャイルウェア]
前のページへ 1|2|3       

【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技術者認定シルバー試験問題作成者)

平成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:山根 剛司


前のページへ 1|2|3       

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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