LoginSignup
1
1

More than 5 years have passed since last update.

RoR|GETでアクセスするアクションが複数あったらどうするか

Last updated at Posted at 2017-05-17

Ruby on Railsでコントローラーの中でアクションは違えど
同じHTTPメソッドを使っている場合にどう住み分けをするかという話。

準備

scaffoldで本(Book)についてのコードを自動生成します。

$ rails g scaffold book title

本についての情報をすべてCSVでダウンロードするBooksController#downloadを作成します。
ルーティングはgetを使って追加します。

Rails.application.routes.draw do
  resources :books
  get 'books/download'
end

/books/downloadにアクセスすると対応するBooksController#showが実行されます。
ルーティングはroutes.rbの上にある設定値が優先されるためdownloadがあたかもidのように処理されて例外が発生しています。

Error#1.png

対策

ベストではないですが、URLフォーマットを特定の形式に制限するとうまくいきました。
:idはすべて整数値であること期待するようにします。

つまり、/books/5といった:idが整数なアクセスであればBooksController#showを実行するように制限すると、
その他のHTTPメソッドがGETであるルーティングはroutes.rbに準ずるようになりました。

Rails.application.routes.draw do
  resources :books, constraints: {id: /[0-9]+/}
  get 'books/download'
end

formatを利用してアクションを切り替えてもいいかもしれません。
CSVダウンロードだったら別にコントローラを作れという説もあります。

検証環境

Ruby 2.4
Rails 5.1.1

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1