SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Railsによるクライアントサイド開発入門

簡単にWebサービスの柔軟性が向上! Rails7のAPIモードの使い方をサンプルを通して学ぶ

Railsによるクライアントサイド開発入門 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

検索APIの追加

 一覧、詳細、作成、更新、削除のための基本的なAPIはScaffoldingによって簡単に実装できました。ただし実用的なWebサービスでは、検索や一括更新、一括削除といったAPIも必要になってくるでしょう。ここからは検索APIを実装し、独自のAPIの実装手順を紹介します。

APIの仕様

 検索APIは、検索語を受け取り、それをnameフィールド、contentフィールドに含むものを配列で返すものとします。アクションは、GETメソッドでもPOSTメソッドでも受け付けるものとします。クエリパラメータは「q=keyword」のように指定するとします。

アクションを追加する

 既定で存在するリソースベースのルーティングルールに、searchアクションを追加します。config/routes.rbファイルのresourcesメソッドにdoブロックを続けて、collectionブロックを追記してさらにsearchアクションを追記します。

リスト config/routes.rb
resources :messages do
  collection do
    get 'search'		# messageコントローラのsearchアクション(GET)
    post 'search'		# messageコントローラのsearchアクション(POST)
  end
end

[NOTE]collectionブロックとmemberブロック

 ここではcollectionブロックを追記しましたが、これはresourcesメソッドで定義されるもの以外のルートを定義したい場合に用います。対となるものにmemberブロックがあります。これらの違いは以下の通りです。APIの機能によって使い分ける必要があります。

  • collection…search(検索)のように、ルートに対象のレコードを表すパラメータを含まない
  • member…info(情報取得)のように、ルートに対象のレコードを表すパラメータを含む

 app/controllers/messages_controller.rbファイルには、アクションの処理内容を追記します。クエリパラメータが指定されている場合のみnameフィールドとcontentフィールドにあいまい検索を実行し、見つかればレコードの配列をJSON形式で返します。

リスト app/controllers/messages_controller.rb
…略…
# GET /messages/search
# POST /messages/search
def search
  @messages = []			# 既定値は空の配列
  @query = params[:q]
  if !@query.blank?			# クエリパラメータが存在する場合のみ
    @query = '%' + @query + '%'
    begin
      @messages = Message.where(["name like ? or content like ?", @query, @query])
    rescue				# 例外発生時には既定値を返す
    end
  end
  render json: @messages
end

private
…略…

アクション(API)を呼び出す

 Pumaサーバを起動し、curlコマンドでリクエストを発行してみましょう。GETメソッドとPOSTメソッドの両方のケースを試しています。GETメソッドで呼び出す場合には、URLを引用符で囲む必要があることに注意してください。検索語を含むレコードがあればその結果が配列で返り、見つからない、検索語が指定されていないという場合には空の配列が返ります。

% curl 'http://localhost:3000/messages/search?q=Nao'
[{"id":1,"name":"Nao","content":"こんにちは!","posted":"2022-12-19T18:01:34.000Z","created_at":"2022-12-19T09:07:34.682Z","updated_at":"2022-12-19T09:07:34.682Z"}]
% curl 'http://localhost:3000/messages/search' -X POST -d "q=Nao"
…同様なので略…
% curl 'http://localhost:3000/messages/search?q=Zeus'
[]
% curl 'http://localhost:3000/messages/search?q='
[]
% curl 'http://localhost:3000/messages/search'
[]

 このように、簡単な手順でAPIが実装できました。

まとめ

 今回は、RailsのAPIモードを紹介しました。APIモードにおいても、通常のRailsアプリケーションの開発ノウハウがそのまま活用できることをお伝えできたのではないかと思います。次回からは、Action Cableを用いたリアルタイムWebを紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Railsによるクライアントサイド開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17241 2023/02/21 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング