{"id":96853,"date":"2026-06-08T17:57:48","date_gmt":"2026-06-08T08:57:48","guid":{"rendered":"https://freelance.indieverse.co.jp/media/?p=96853"},"modified":"2026-06-08T17:59:25","modified_gmt":"2026-06-08T08:59:25","slug":"rails-api","status":"publish","type":"post","link":"https://freelance.indieverse.co.jp/media/programming/ruby/rails-api","title":{"rendered":"Rails APIモードとは？作り方・通常のRailsとの違い・実務で使うポイントを解説"},"content":{"rendered":"<ul>\n<li><strong>Rails APIモードとは何か知りたい</strong></li>\n<li><strong>通常のRailsアプリとAPIモードの違いを知りたい</strong></li>\n<li><strong>RailsでJSON APIを作る基本手順を知りたい</strong></li>\n<li><strong>ReactやスマホアプリとつなぐRailsバックエンドを作る時の注意点を知りたい</strong></li>\n</ul>\n<p><strong>Rails APIモードを使えば、Ruby on RailsでJSON APIを作れます。</strong>通常のRailsアプリのようにHTML画面をサーバー側で描画するのではなく、React、Vue、スマホアプリ、外部サービスなどにJSONを返すことを主な役割にします。まずは小さなCRUD APIを作り、通常Railsとの違い、JSONレスポンス、認証やCORSの注意点を順番に押さえるのが近道です。</p>\n<p>Rails公式ガイドでも、API-onlyアプリケーションは <code>rails new my_api --api</code> で作成でき、通常のRailsよりブラウザ向け機能を絞った構成になると説明されています。この記事では、Rails APIモードの概要、通常Railsとの違い、作り方、JSONレスポンスの書き方、実務で注意するポイントまで解説します。</p>\n<h2>Rails APIモードとは</h2>\n<h3>RailsをJSON APIのバックエンドとして使う構成</h3>\n<p><strong>Rails APIモードとは、Railsを画面表示用のWebアプリではなく、JSONを返すAPIサーバーとして使うためのモードです。</strong>たとえば、フロントエンドをReactで作り、バックエンドをRailsで作る場合、Rails側はユーザー情報や商品一覧などをJSONで返します。</p>\n<h3>ViewではなくJSONレスポンスを中心にする</h3>\n<p>通常のRailsでは、ControllerがHTMLテンプレートを呼び出し、ブラウザにHTMLを返す構成がよく使われます。一方、Rails APIモードではControllerがJSONを返す前提になり、View、helper、assetsなどのブラウザ向け機能は初期状態では省かれます。</p>\n<h3>Railsのバックエンド機能は引き続き使える</h3>\n<p>APIモードでも、Railsの便利な機能がすべて消えるわけではありません。ルーティング、Controller、Active Record、バリデーション、マイグレーション、ログ、テスト、キャッシュなど、バックエンド開発に必要な機能は引き続き使えます。</p>\n<h2>Rails APIモードと通常のRailsアプリの違い</h2>\n<h3>初期構成の違いを把握する</h3>\n<p><strong>Rails APIモードと通常のRailsアプリの大きな違いは、HTML画面を作るための機能を初期状態で持つかどうかです。</strong>Rails APIモードでは、APIサーバーに必要な機能を中心に構成されます。</p>\n<table>\n<thead>\n<tr>\n<th>比較項目</th>\n<th>通常のRailsアプリ</th>\n<th>Rails APIモード</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>主な役割</td>\n<td>HTML画面を返すWebアプリ</td>\n<td>JSONを返すAPIサーバー</td>\n</tr>\n<tr>\n<td>Controllerの継承元</td>\n<td><code>ActionController::Base</code></td>\n<td><code>ActionController::API</code></td>\n</tr>\n<tr>\n<td>View / helper / assets</td>\n<td>初期状態で使う</td>\n<td>初期状態では生成を省く</td>\n</tr>\n<tr>\n<td>Cookie / session / flash</td>\n<td>画面遷移で使いやすい</td>\n<td>必要な場合に追加して使う</td>\n</tr>\n<tr>\n<td>向いている構成</td>\n<td>サーバー側で画面も作るWebサービス</td>\n<td>SPA、スマホアプリ、外部連携API</td>\n</tr>\n</tbody>\n</table>\n<h3>APIモードは通常Railsの上位互換ではない</h3>\n<p>Rails APIモードは「通常のRailsより必ず優れている」というものではありません。HTML画面をRailsで作るなら通常のRailsアプリが自然です。フロントエンドとバックエンドを分け、RailsをAPIサーバーとして使うならAPIモードが向いています。</p>\n<h2>Rails APIアプリを作る手順</h2>\n<h3><code>rails new --api</code>で新規作成する</h3>\n<p><strong>新しくRails APIアプリを作る場合は、<code>rails new</code> に <code>--api</code> オプションを付けます。</strong>これにより、API向けのControllerやgenerator設定でアプリが作成されます。</p>\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>rails new my_api --api\r\ncd my_api</code></pre>\n<h3>scaffoldでCRUDの流れを確認する</h3>\n<p>リソースを作る場合は、通常のRailsと同じようにscaffoldやmodel/controller generatorを使えます。</p>\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>bin/rails g scaffold Article title:string body:text\r\nbin/rails db:migrate</code></pre>\n<h3>生成されたControllerをAPI設計に合わせて整理する</h3>\n<p>APIモードのscaffoldでは、HTMLテンプレートを作るのではなく、JSONを返すControllerが中心になります。最初はscaffoldで全体像を見てから、自分のAPI設計に合わせてController、serializer、routesを整理すると理解しやすいです。</p>\n<h2>既存のRailsアプリをAPIモードに近づける方法</h2>\n<h3><code>config.api_only</code>を使う前に影響範囲を見る</h3>\n<p><strong>既存のRailsアプリをAPI中心にしたい場合は、<code>config.api_only = true</code> と <code>ActionController::API</code> の利用を検討します。</strong>ただし、既存アプリでView、session、Cookie、flashを使っている場合、単純に切り替えると画面側の機能が壊れる可能性があります。</p>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># config/application.rb\r\nmodule MyApp\r\n  class Application &lt; Rails::Application\r\n    config.api_only = true\r\n  end\r\nend</code></pre>\n<h3>Controllerの継承元を切り替える</h3>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># app/controllers/application_controller.rb\r\nclass ApplicationController &lt; ActionController::API\r\nend</code></pre>\n<h3>HTML画面を残すならAPI用Controllerを分ける</h3>\n<p>既存アプリをAPI化する時は、まず「HTML画面を今後もRailsで返すのか」「JSON APIだけに寄せるのか」を決めましょう。管理画面やログイン画面をRailsで持ち続けるなら、通常RailsのままAPI用Controllerだけを切り出す選択肢もあります。</p>\n<h2>コントローラでJSONを返す書き方</h2>\n<h3>一覧・詳細では<code>render json:</code>を明示する</h3>\n<p><strong>Rails APIのControllerでは、<code>render json:</code> を使ってJSONレスポンスを返します。</strong>APIモードではテンプレートが自動で描画される前提ではないため、各actionで何を返すかを明示することが大切です。</p>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>class ArticlesController &lt; ApplicationController\r\n  def index\r\n    articles = Article.order(created_at: :desc)\r\n    render json: articles\r\n  end\r\n\r\n  def show\r\n    article = Article.find(params[:id])\r\n    render json: article\r\n  end\r\nend</code></pre>\n<h3>作成・更新ではHTTPステータスも返す</h3>\n<p>作成・更新・削除では、HTTPステータスも一緒に返すと、フロントエンド側が成功・失敗を判断しやすくなります。</p>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>class ArticlesController &lt; ApplicationController\r\n  def create\r\n    article = Article.new(article_params)\r\n\r\n    if article.save\r\n      render json: article, status: :created\r\n    else\r\n      render json: { errors: article.errors }, status: :unprocessable_entity\r\n    end\r\n  end\r\n\r\n  def destroy\r\n    article = Article.find(params[:id])\r\n    article.destroy\r\n    head :no_content\r\n  end\r\n\r\n  private\r\n\r\n  def article_params\r\n    params.require(:article).permit(:title, :body)\r\n  end\r\nend</code></pre>\n<h3>代表的なステータスコードを揃える</h3>\n<table>\n<thead>\n<tr>\n<th>処理</th>\n<th>よく使うステータス</th>\n<th>意味</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>一覧・詳細取得</td>\n<td><code>200 OK</code></td>\n<td>正常にデータを返す</td>\n</tr>\n<tr>\n<td>作成成功</td>\n<td><code>201 Created</code></td>\n<td>新しいリソースを作成した</td>\n</tr>\n<tr>\n<td>削除成功</td>\n<td><code>204 No Content</code></td>\n<td>本文なしで成功を返す</td>\n</tr>\n<tr>\n<td>入力エラー</td>\n<td><code>422 Unprocessable Entity</code></td>\n<td>バリデーションエラーなど</td>\n</tr>\n<tr>\n<td>認証エラー</td>\n<td><code>401 Unauthorized</code></td>\n<td>ログインやtokenが必要</td>\n</tr>\n</tbody>\n</table>\n<h2>ルーティング・params・Strong Parametersの考え方</h2>\n<h3>RESTfulなroutesで入口を整理する</h3>\n<p><strong>Rails APIでも、RESTfulなルーティングとStrong Parametersを使って入力値を安全に扱います。</strong>APIだからといって、受け取ったJSONをそのままModelへ渡すのは避けましょう。</p>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># config/routes.rb\r\nRails.application.routes.draw do\r\n  resources :articles, only: %i[index show create update destroy]\r\nend</code></pre>\n<h3>JSONリクエストは<code>params</code>で受け取る</h3>\n<p>フロントエンドから次のようなJSONを送る場合、Rails側では <code>params</code> から値を取得できます。</p>\n<pre class=\"prism line-numbers lang-json\" data-lang=\"JSON\"><code>{\r\n  \"article\": {\r\n    \"title\": \"Rails API入門\",\r\n    \"body\": \"RailsでJSON APIを作る\"\r\n  }\r\n}</code></pre>\n<h3>Strong Parametersで許可項目を明示する</h3>\n<p>実務では、許可する項目をStrong Parametersで明示します。<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-hash\">RubyのHash</a>やparamsの扱いに慣れておくと、APIで受け取るデータ構造を読みやすくなります。</p>\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>def article_params\r\n  params.require(:article).permit(:title, :body)\r\nend</code></pre>\n<h2>認証・CORS・serializerで注意すること</h2>\n<p><strong>Rails APIを実務で使う時は、Controllerの書き方だけでなく、認証、CORS、レスポンス形式を先に設計しましょう。</strong>APIはフロントエンドや外部サービスから呼ばれるため、画面表示中心のRailsとはつまずきやすいポイントが変わります。</p>\n<h3>認証方式はフロントエンド構成に合わせる</h3>\n<p>APIでは、session cookie、token、JWT、OAuthなど、構成に応じて認証方式を選びます。SPAやスマホアプリから呼ぶ場合は、どこに認証情報を持たせるか、ログアウトやtoken更新をどう扱うかまで決める必要があります。</p>\n<h3>CORSは開発初期に確認する</h3>\n<p>ReactやVueなど別ドメインのフロントエンドからRails APIを呼ぶ場合、CORS設定が必要になることがあります。ローカル開発では動いても、本番ドメインでブロックされることがあるため、許可するorigin、method、headerを早めに確認しましょう。</p>\n<h3>レスポンスの形はserializerで整理する</h3>\n<p><code>render json: article</code> は最初の学習には分かりやすいですが、実務ではそのまま全カラムを返すと不要な情報まで含まれることがあります。返す項目、ネスト、日付形式、エラー形式を統一するために、serializerや専用のJSON整形クラスを使う設計も検討しましょう。</p>\n<h2>Rails APIモードを使うべきケース</h2>\n<p><strong>Rails APIモードは、RailsをバックエンドAPIとして使い、画面側を別の技術で作る場合に向いています。</strong>特に、次のような構成ではAPIモードを検討しやすいです。</p>\n<ul>\n<li>React、Vue、Next.jsなどのフロントエンドと分けて開発する</li>\n<li>スマホアプリ向けのAPIをRailsで作る</li>\n<li>外部サービスや社内システム向けのREST APIを作る</li>\n<li>管理画面よりもAPIレスポンスの設計が中心になる</li>\n<li>将来的に複数のクライアントから同じバックエンドを使いたい</li>\n</ul>\n<p>一方で、ブログ、管理画面、社内ツールのようにRailsでHTML画面まで作る方が速い場合は、通常のRailsアプリの方が合うこともあります。APIモードは「モダンだから使う」ではなく、アプリの構成に合わせて選びましょう。</p>\n<h2>Rails APIの実務で見られるスキル</h2>\n<h3>JSONを返すだけでなくAPI設計まで見られる</h3>\n<p><strong>Rails APIの実務では、JSONを返すコードだけでなく、API設計、DB設計、認証、テスト、運用まで見られます。</strong>Rails APIモードを学ぶなら、CRUDを作った後に、実務で必要になる周辺スキルまで広げると案件で説明しやすくなります。</p>\n<table>\n<thead>\n<tr>\n<th>スキル</th>\n<th>Rails APIで使う場面</th>\n<th>学習時に確認すること</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>REST API設計</td>\n<td>エンドポイント、HTTPメソッド、ステータスコードを決める</td>\n<td>URL設計とレスポンス形式を説明できるか</td>\n</tr>\n<tr>\n<td>Active Record</td>\n<td>DBから取得したデータをAPIレスポンスに使う</td>\n<td>N+1、scope、validationを理解しているか</td>\n</tr>\n<tr>\n<td>認証・認可</td>\n<td>ログインユーザーごとに返すデータを制御する</td>\n<td>token、権限、エラー時のレスポンスを設計できるか</td>\n</tr>\n<tr>\n<td>テスト</td>\n<td>APIの正常系・異常系を検証する</td>\n<td>request specでstatusとJSONを確認できるか</td>\n</tr>\n<tr>\n<td>運用・ログ</td>\n<td>障害時に原因を追跡する</td>\n<td>ログ、監視、例外処理を考えられるか</td>\n</tr>\n</tbody>\n</table>\n<h3>募集要件から次に学ぶ範囲を逆算する</h3>\n<p>Rails APIのスキルを実務でどう使うか知りたい方は、<a href=\"https://freelance.indieverse.co.jp/job_listings/skills/389\">Ruby on Rails案件一覧</a>で、API開発、バックエンド開発、認証、DB設計、テストなどがどのように募集要件に入っているか確認しておくと、学習する範囲を決めやすくなります。</p>\n<h2>Rails APIを学ぶ順番</h2>\n<h3>小さなCRUD APIから始める</h3>\n<p><strong>Rails APIを初めて学ぶなら、小さなCRUD APIから始めるのが一番分かりやすいです。</strong>いきなり認証や複雑なserializerを入れるより、まずはRailsがJSONを返す流れを体験しましょう。</p>\n<ol>\n<li><code>rails new my_api --api</code> でAPIアプリを作る</li>\n<li><code>resources</code> でRESTfulなroutesを書く</li>\n<li><code>render json:</code> で一覧・詳細を返す</li>\n<li><code>POST</code> / <code>PATCH</code> で作成・更新を作る</li>\n<li>Strong Parametersで入力値を制限する</li>\n<li>エラー時のJSONとHTTPステータスを整える</li>\n<li>request specでAPIの挙動を確認する</li>\n<li>認証、CORS、serializerを追加する</li>\n</ol>\n<h3>Ruby文法もAPIレスポンス整形で使う</h3>\n<p>Rubyの配列変換や整形に不安がある場合は、<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-map\">Rubyのmapメソッド</a>のような基礎文法も合わせて確認しておくと、APIレスポンスの加工が理解しやすくなります。</p>\n<h2>よくある質問</h2>\n<h3>Rails APIモードではViewを使えないですか？</h3>\n<p><strong>初期状態ではViewやhelperなどの生成が省かれますが、必要な機能を追加して使うことはできます。</strong>ただし、HTML画面をRailsで多く作るなら、最初から通常のRailsアプリとして作る方が自然な場合があります。</p>\n<h3>Rails APIモードでもActive Recordは使えますか？</h3>\n<p><strong>使えます。</strong>APIモードはView周りを軽くする構成であり、Active Record、マイグレーション、バリデーションなどのDB関連機能はRailsのバックエンド機能として利用できます。</p>\n<h3>Rails APIではDeviseを使えますか？</h3>\n<p><strong>使えますが、通常の画面ログインとは設計が変わることがあります。</strong>SPAやスマホアプリと接続する場合は、session cookieで扱うのか、tokenやJWTを使うのか、フロントエンド側の保存方法まで合わせて決める必要があります。</p>\n<h3>Rails APIとGraphQLはどちらがよいですか？</h3>\n<p><strong>まずREST APIで十分かを考えましょう。</strong>Rails APIモードはREST APIを作りやすい構成です。クライアントごとに取得項目を細かく変えたい、複雑なデータ取得を1回のリクエストで扱いたい場合はGraphQLも候補になります。</p>\n<h3>Rails APIモードは初心者にもおすすめですか？</h3>\n<p><strong>RailsのMVCやHTTPの基礎を学びながらならおすすめです。</strong>ただし、APIモードでは画面が自動で表示されないため、JSONレスポンス、HTTPステータス、フロントエンドとの接続を意識する必要があります。最初は小さなCRUD APIから始めましょう。</p>\n<h2>まとめ</h2>\n<p><strong>Rails APIモードは、RailsをJSON APIのバックエンドとして使うための構成です。</strong><code>rails new my_api --api</code> で作成でき、通常のRailsアプリよりView、helper、assetsなどのブラウザ向け機能を絞った状態で始められます。</p>\n<p>Rails APIを理解するには、通常Railsとの違い、<code>ActionController::API</code>、<code>render json:</code>、RESTful routing、Strong Parameters、HTTPステータスを順番に押さえることが大切です。実務ではさらに、認証、CORS、serializer、request spec、ログや監視まで求められます。</p>\n<p>まずは小さなCRUD APIを作り、JSONの返し方とエラー時のレスポンスを整理しましょう。そのうえで、<a href=\"https://freelance.indieverse.co.jp/job_listings/skills/389\">Ruby on Rails案件一覧</a>を確認すると、Rails APIのスキルが実務でどのように評価されるか把握しやすくなります。</p>\n<p>参考: <a href=\"https://guides.rubyonrails.org/v8.0.0/api_app.html\">Rails公式ガイド「Using Rails for API-only Applications」</a>、<a href=\"https://api.rubyonrails.org/classes/ActionController/API.html\">Rails APIドキュメント「ActionController::API」</a></p>\n","protected":false},"excerpt":{"rendered":"<p>Rails APIモードとは何か、通常のRailsアプリとの違い、rails new &#8211;apiでの作り方、JSONレスポンス、認証・CORSなど実務で注意するポイントを解説します。</p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[190],"tags":[286,275],"class_list":["post-96853","post","type-post","status-publish","format-standard","hentry","category-ruby","tag-ruby","tag-ruby-on-rails"],"aioseo_notices":[],"meta_description":"Rails APIモードとは何か、通常のRailsアプリとの違い、rails new --apiでの作り方、JSONレスポンス、認証・CORSなど実務で注意するポイントを解説します。","_links":{"self":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/96853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts"}],"about":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/comments?post=96853"}],"version-history":[{"count":2,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/96853/revisions"}],"predecessor-version":[{"id":96855,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/96853/revisions/96855"}],"wp:attachment":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media?parent=96853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/categories?post=96853"},{"taxonomy":"post_tag","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/tags?post=96853"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}