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プログラミング

実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング