Rails 5 のプロジェクトを API モードで生成すると CORS 対応するためのイニシャライザーが含まれている。今回はそのイニシャライザーで CORS 対応する方法をメモっとく。
API モードでプロジェクトを生成する
API モードの Rails プロジェクトを生成する。サンプルプロジェクトは本を登録できる本棚プロジェクト。
$ rails new bookshelf --api
$ cd bookshelf
rack-cors gem をインストールする
Gemfile の rack-cors gem を有効にする。
--- a/Gemfile
+++ b/Gemfile
@@ -18,7 +18,7 @@
 gem 'puma', '~> 3.0'
 # gem 'capistrano-rails', group: :development
 
 # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
-# gem 'rack-cors'
+gem 'rack-cors'
 
 group :development, :test do
   # Call 'byebug' anywhere in the code to stop execution and get a debugger console 
rack-cors gem をインストールする。
$ bundle
cors.rb を設定する
config/initializers/cors.rb の設定を有効にする。今回は origins に * を設定して、全てのオリジンからのアクセスを許可している。本番運用するときは適切に設定してほしい。
--- a/config/initializers/cors.rb
+++ b/config/initializers/cors.rb
@@ -5,12 +5,12 @@
 
 # Read more: https://github.com/cyu/rack-cors
 
-# Rails.application.config.middleware.insert_before 0, Rack::Cors do
-#   allow do
-#     origins 'example.com'
-#
-#     resource '*',
-#       headers: :any,
-#       methods: [:get, :post, :put, :patch, :delete, :options, :head]
-#   end
-# end
+Rails.application.config.middleware.insert_before 0, Rack::Cors do
+  allow do
+    origins '*'
+
+    resource '*',
+      headers: :any,
+      methods: [:get, :post, :put, :patch, :delete, :options, :head]
+  end
+end
API を Scaffold 機能で生成する
動作検証用に API を Scaffold 機能で生成する。サンプル API は本を登録できる API。
$ rails g scaffold book title:string
$ rails db:migrate
Rails サーバーを起動して動作検証する
Rails サーバーを起動する。
$ rails s
適当な SSL 接続ではない Web サイト rubyonrails.org などにアクセスして、Chrome のデベロッパーツールの Network と Console を開いて下記の JavaScript を実行する。
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/books');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send('{ "title": "JavaScript: The Definitive Guide, 6th Edition" }');
OPTIONS メソッドのプリフライトリクエストと POST メソッドのリクエストの2つのリクエストが送信される。それぞれ 200 OK と 201 Created というステータスコードが返ってくれば正常に動作している。