Rails4でのHTTP OPTIONSのルーティング
Rails3.2では動作していた、CORSのプリフライト(HTTP OPTIONS)に対するルートが、Rails4.1.5にしたらエラーになってしまいました。
ググるといくつか対処法が見つかったのですが、どれもイマイチだったので、自分で調べてみました。
Rails3.2で動作していたルート
Rails3.2では以下のルートで正常に動作していました:
get '*all' => ’some_controller#some_action', constraints: {method: 'OPTIONS'}
これをRails4.1.5で動かすと、
ActionController::RoutingError (No route matches [OPTIONS] … )
というエラーになってしまいます。
Rails4でのルート
Rails4では get
メソッドがGETリクエストしか受け付けなくなったので、上記のルートは「HTTPメソッドがGETとOPTIONSの両方でなければならない」という矛盾した定義になってしまったのだと思われます。
まず、GETリクエストに限定してしまう get
は使えないので、 match
を使うことになります。
Rails4からは match
を使う場合、必ず via:
オプションを付けてHTTPメソッドを限定する必要があります。
この via:
オプションにOPTIONSを指定したらどうか?
match '*path', to: 'some_controller#some_action', via: :options
あっさりうまくいきました!
なお、 via: :options
というのは、ドキュメントやソースには説明がないようなのですが、HTTPメソッドはすべて指定できるということでしょう。
参考情報
Rails Routing from the Outside In — Ruby on Rails Guides
実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング
- 作者: 黒田努
- 出版社/メーカー: インプレスジャパン
- 発売日: 2014/05/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る