7
Help us understand the problem. What are the problem?

posted at

updated at

Rails APIのルーティングnamespaceってなんで使うの?

はじめに

Vue.jsをRailsで使うときにバックエンドをRailsのAPIモードで作り、
フロントエンドをVue.jsで作る記事をよく見かけた。
その際にルーティングでnamespaceを使っていたけれど
なぜnamespaceを使うのかよくわからず、苦手意識があったので理解するため、まとめてみました。

まずはAPIとはそもそもなんぞやというところからはじめてみましょう。

対象読者
  • Railsを勉強してたけど、APIモードで課題を提出しなきゃいけなくなった方
  • Vue.jsなどフロントエンドも勉強している方

APIとは

APIApplication Programming Interfaceの略です。
ソフトウェアの機能を共有できる仕組みのこと。よく使われているものだとGoogle Mapなど。
郵便番号を入れると自動で入力されるなんてことができるのもこれのおかげだったり。

APIは通常Webに公開されていて、誰でも無料で使うことが可能。「WebAPI」と呼ばれたりもします。
一般的にJSONという形式で結果を返します。

RailsのAPIモードとは

RailsのAPIモードはそのAPIをRailsで作成できるAPI作成に特化したモードのこと。
APIモードではMVCのViewが作成されません。
そのため、sass-railsやwebpacker、capybabaraなどはGemfaileには生成されません。

Rails4まではrails-apiというgemを入れる必要があったみたいですが
現在のバージョンでは特に何もしなくても使えます。

rails new アプリケーション名 --api

と打つだけでAPIモードのRailsアプリケーションが作成されます。

次にそもそもnamespaceってなにという疑問を解消していきます。

Railsのルーティング

RailsのルーティングはMVCモデルの基本の基本と言えるもので
Viewから送られたリクエストを適切なコントローラーに送り、どんなアクションを行うかを管理するものです。

ルーティングはRailsアプリケーションのconfigディレクトリの中にあるroutes.rbに記述します。

Railsルーティング種類は調べてみるとたくさんありました。
  • urlを直接指定する
  • root
  • resouce
  • resouces
  • collection
  • member
  • new
  • param
  • shallow
  • namespace
  • scope
  • concern
  • constraints

などなどたくさんあります。深そうですね。。。

scopeとnamespaceの違い

ルーティングのまとめは別の機会にするとして
今回はその中でnamespaceにフォーカスを当てていきますが、
namespaceと似たようなscopeとの比較してみます。

scope namespace
URL 指定のパス          指定のパス
コントローラ   通常のcontroller内    controllerの中の指定のフォルダ

scopeもnamespaceもURLを指定のパスにできますが
namespaceはファイル構成も変えたい場合にいいみたいです。
scopeでもいいような気もしますね。

APIのバージョン

railsのAPIを調べているとnamespaceを使ったroutes.rbの

Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      resources :posts
    end
  end
end

などのところにあるv1という記述。
調べてみるとバージョン1の意味でした。
バージョン管理をするためにscopeではなく、namespaceを使っているのかとAPIのバージョン管理とは
なんぞやと調べていきます。

Web APIのバージョン管理の重要性

Web APIとはアプリケーションのインターフェイスの役割を持ち、追加、変更、廃止などされていくものです。
通常のアプリもver.1.0.8とか書かれていますよね。
セマンティックバージョニングと言います。

バージョン管理を特にせず、管理者がこっちの方がいいから変更しよう〜とAPIを書き換えてしまったら
そのAPIを使っているユーザーがいきなり使えなくなってしまう可能性があります。

例えばFacebookやGoogleなどのAPIが急に変更されると
エラーが出て処理が止まったり、表示がおかしくなるなどの不具合が発生します。

それを防ぐために公開されているAPIは複数のバージョンを提供して、
そういう事態を招くことを防いでいるわけです。

APIのURI一覧

とURIの中を見てみると、v○とあります。

いくつかバージョンの管理方法があるようなのですが
URIにバージョンを埋め込むのがよく利用される方法のようです。

まとめ

これらから考えられることはWeb APIは一人のユーザーが利用するものでなく、
アプリケーションと同様に多くの人が利用するために作られるためバージョン管理がされている。
その慣例としてv1などのバージョンをつけてルーティングをつけている。
それを実現するにはscopeよりもnamespaceが良いため、namespaceでルーティングをしていることが考えられる。

終わりに

RailsでAPIを作るとなったときに
知らないnamespaceなどが出てきてよくわからなくて混乱しましたが
なぜそうしているのかを時間はかかりますが紐解くのは大事です。

さまざまな記事を読ませていただいたのですが、それ違うなどもあると思いますので
ぜひご指摘いただけたら嬉しいです。

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?