序章

GraphQL は、API用の強く型付けされたクエリ言語であり、既存のデータを使用してこれらのクエリを実行するためのサーバー側ランタイムです。 GraphQLを使用すると、クライアントはクエリで必要な正確なデータを指定できるようになり、1回のリクエストでサーバーから複数のリソースをフェッチできます。 これにより、複数のAPI呼び出しが不要になります。 GraphQLは言語とデータベースに依存しないため、選択したデータベースとともに、ほぼすべてのプログラミング言語で実装できます。

このチュートリアルでは、メモを取るためのGraphQLを利用したRuby onRailsAPIを構築します。 終了すると、GraphQLを使用してAPIからメモを作成および表示できるようになります。

このチュートリアルのコードを確認したい場合は、 DigitalOcean CommunityGitHubでこのチュートリアルのコンパニオンリポジトリを確認してください。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • 開発マシンにインストールされているRubyプログラミング言語とRubyonRailsフレームワーク。 このチュートリアルは、Rubyのバージョン2.6.3およびRailsのバージョン6.0.2.1でテストされているため、インストールプロセス中にこれらのバージョンを指定してください。 次のチュートリアルのいずれかに従って、RubyとRailsをインストールします。
  • PostgreSQLがインストールされています。 このチュートリアルに従うには、PostgreSQLバージョン11.2を使用します。 次のチュートリアルのいずれかのステップ1と2に従って、PostgreSQLをインストールします。

ステップ1—新しいRailsAPIアプリケーションをセットアップする

このステップでは、新しいRails APIアプリケーションをセットアップし、それをPostgreSQLデータベースに接続します。 これは、メモを取るAPIの基盤として機能します。

Railsは、開発者が最新のWebアプリケーションをより速く構築できるようにするコマンドを提供します。 これらのコマンドは、新しいRailsアプリケーションの作成から、アプリ開発に必要なファイルの生成まで、さまざまなアクションを実行できます。 これらのコマンドの完全なリストとその機能については、ターミナルウィンドウで次のコマンドを実行してください。

  1. rails -h

このコマンドは、アプリケーションのパラメーターを設定するために使用できるオプションの広範なリストを生成します。 リストされているコマンドの1つは new コマンドを受け入れます。 APP_PATH 指定されたパスに新しいRailsアプリケーションを作成します。

を使用して新しいRailsアプリケーションを作成します new 発生器。 ターミナルウィンドウで次のコマンドを実行します。

  1. rails new rails_graphql -d=postgresql -T --api

これにより、次の名前のディレクトリに新しいRailsアプリケーションが作成されます。 rails_graphql 必要な依存関係をインストールします。 に関連付けられているフラグを調べてみましょう new 指図:

  • The -d flagは、指定されたデータベースでアプリケーションを事前構成します。
  • The -T このチュートリアルではテストを作成しないため、flagはRailsにテストファイルを生成しないように指示します。 Railsが提供するもの以外の別のテストフレームワークを使用する場合にも、このフラグを使用できます。
  • The --api flagは、Railsを使用してAPIを構築するために必要なファイルのみを使用してRailsアプリケーションを構成します。 ブラウザアプリケーションに必要な設定の構成をスキップします。

コマンドの実行が完了したら、新しく作成したものに切り替えます rails_graphql アプリケーションのルートディレクトリであるディレクトリ:

  1. cd rails_graphql

これで、新しいRails APIアプリケーションが正常にセットアップされたので、アプリを実行する前に、それをデータベースに接続する必要があります。 Railsは database.yml で見つかったファイル config/database.yml、これには、さまざまな開発環境のさまざまなデータベースにアプリを接続するための構成が含まれています。 Railsは、アンダースコア((_)に続いて、アプリの名前に環境名を付けます。 環境データベース名はいつでも好きな名前に変更できます。

注:変更できます config/database.yml Railsがデータベースの作成に使用するPostgreSQLの役割を選択します。 パスワードで保護されたロールを作成した場合は、 Ubuntu18.04またはHowToでRubyonRailsアプリケーションでPostgreSQLを使用する方法のステップ4の手順に従ってください。 macOS上のRubyonRailsアプリケーションでPostgreSQLを使用して、役割を構成します。

Railsには、データベースを作成および操作するためのコマンドが含まれています。 データベースのクレデンシャルを設定したら、ターミナルウィンドウで次のコマンドを実行してデータベースを作成します。

  1. rails db:create

The db:create コマンドは developmenttest で提供される情報に基づくデータベース config/database.yml ファイル。 コマンドを実行すると、次の出力が得られます。

Output
Created database 'rails_graphql_development' Created database 'rails_graphql_test'

アプリケーションがデータベースに正常に接続されたら、アプリケーションをテストして動作することを確認できます。 ローカルで作業している場合は、次のコマンドを使用してサーバーを起動します。

  1. bundle exec rails server

開発サーバーで作業している場合は、サーバーがバインドするIPアドレスを指定してアプリケーションを起動できます。

  1. bundle exec rails server --binding=your_server_ip

:サーバーはポートでリッスンします 3000. 開発サーバーで作業している場合は、ポートを開いていることを確認してください 3000 接続を許可するためにファイアウォールで。

The rails server コマンドは、Railsとともに配布されるRuby用のWebサーバーであるPumaを起動します。 The --binding=your_server_ip コマンドは、サーバーを指定したIPにバインドします。

このコマンドを実行すると、コマンドプロンプトは次の出力に置き換えられます。

Output
=> Booting Puma => Rails 6.0.2.1 application starting in development => Run `rails server --help` for more startup options Puma starting in single mode... * Version 4.3.1 (ruby 2.6.3-p62), codename: Mysterious Traveller * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://127.0.0.1:3000 * Listening on tcp://[::1]:3000 Use Ctrl-C to stop

アプリケーションを実行するには、に移動します localhost:3000 また http://your_server_ip:3000 ブラウザで。 Railsのデフォルトのウェルカムページが表示されます。

ウェルカムページは、Railsアプリケーションが適切に設定されていることを意味します。

サーバーを停止するには、を押します CTRL+C サーバーが実行されているターミナルウィンドウで。

これで、メモを取るAPI用のRailsAPIアプリケーションが正常にセットアップされました。 次のステップでは、GraphQLクエリを受信して実行するようにRailsAPIアプリケーションを設定します。

ステップ2—Rails用のGraphQLのセットアップ

このステップでは、GraphQLで動作するようにRailsAPIアプリケーションを構成します。 RailsでのGraphQL開発に必要なgemをインストールしてセットアップします。

前述のように、GraphQLは言語に依存せず、多くのプログラミング言語で実装されています。 graphql-ruby gemは、GraphQLのRuby実装です。 GraphQLは、GraphQLクエリを実行するためのGraphiQLと呼ばれるインタラクティブなブラウザー内IDEも提供します。 grafiql-rails gemは、開発環境にGraphiQLを追加するのに役立ちます。

これらの依存関係をインストールするには、プロジェクトの Gemfile nanoまたはお気に入りのテキストエディタを使用して編集する場合:

  1. nano Gemfile

追加します graphqlgraphiql-rails Gemfileへのgem。 あなたは追加することができます graphiql どこでも宝石ですが、 graphiql-rails gemは、開発の依存関係の下に追加する必要があります。

〜/ rails_graphql / Gemfile
...
group :development do
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'graphiql-rails'
end

gem 'graphql', '1.9.18'
...

gemの追加が完了したら、ファイルを保存して閉じます。

ターミナルウィンドウで、次のコマンドを使用してgemをインストールします。

  1. bundle install

出力は、gemがインストールされていることを示しています。

The graphql gemは、さまざまなファイルを作成するためのジェネレーターを提供します。 使用可能なジェネレーターを表示するには、ターミナルウィンドウで次のコマンドを実行します。

  1. rails generate

接頭辞が付いたジェネレータ graphql: に関連付けられているものです graphql 宝石。

を使用します graphql:install 追加するコマンド graphql-ruby アプリケーションへのボイラープレートコードを作成し、開発環境にGraphiQLをマウントします。 ボイラープレートコードには、 graphql-ruby Railsで動作するgem。

ターミナルウィンドウで、次のコマンドを実行します。

  1. rails g graphql:install

このコマンドは、以下を含むいくつかのファイルを生成します graphql_controller.rb にあるファイル app/controllers/graphql_controller.rbgraphql のディレクトリ app/graphql RailsでGraphQLを使い始めるために必要なファイルが含まれています。 また、 /graphql HTTP POST にあるroutesファイルのroute config/routes.rb. このルートはにマップされます app/controllers/graphql_controller.rb#execute GraphQLサーバーへのすべてのクエリを処理するメソッド。

GraphQLエンドポイントをテストする前に、GraphiQLエンジンをroutesファイルにマウントして、GraphiQLブラウザー内IDEにアクセスできるようにする必要があります。 これを行うには、次の場所にあるルートファイルを開きます。 config/routes.rb:

  1. nano ~/rails_graphql/config/routes.rb

次のコードをファイルに追加して、開発環境にGraphiQLエンジンをマウントします。

〜/ rails_graphql / config / routers.rb
Rails.application.routes.draw do
  if Rails.env.development?
    mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "graphql#execute"
  end
  post "/graphql", to: "graphql#execute"
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

これにより、GraphiQLエンジンが /graphiql パスし、すべてのクエリを graphql#execute 方法。

これはで作成されたAPIアプリケーションであるため --api フラグ、それはブラウザでページをレンダリングすることを期待していません。 GraphiQLエディターをブラウザーに表示するには、アプリケーションの構成にいくつかの小さな変更を加える必要があります。

まず、 application.rb にあるファイル config/application.rb:

  1. nano ~/rails_graphql/config/application.rb

次に、コメントを外します require "sprockets/railtie" ライン:

〜/ rails_graphql / config / application.rb
require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_mailbox/engine"
require "action_text/engine"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

...

行のコメントを解除した後、ファイルを保存して閉じます。

次に、 config のディレクトリ app/assets:

  1. mkdir -p app/assets/config

次に、 manifest.js 新しく作成されたファイル config ディレクトリ。 The manifest.js fileは、コンパイルしてブラウザで使用できるようにする追加のアセットを指定します。

  1. nano app/assets/config/manifest.js

Railsにプリコンパイルするように指示するファイルに次のコードを追加します graphiql/rails/application.cssgraphiql/rails/application.js Railsがそれらをブラウザに提供できるようにするためのファイル:

〜/ rails_graphql / app / Assets / config /manifest.js
//= link graphiql/rails/application.css
//= link graphiql/rails/application.js

ファイルを保存して閉じます。

これで、GraphQLエンドポイントをテストできます。 開発サーバーを再起動し、ブラウザで次の場所に移動します localhost:3000/graphiql また http://your_server_ip:3000/graphiql. GraphiQLクエリエディターがブラウザーに表示されます。

GraphiQL IDEの左側はGraphQLクエリを受け入れ、右側は実行クエリの結果を表示します。 GraphiQLクエリエディターには、GraphQLスキーマを利用した構文ハイライトと先行入力ヒントもあります。 一緒に、これらはあなたが有効なクエリを作るのを助けます。

試してみるには Hello World たとえば、エディタの左側のペインでデフォルトのテキストをクリアし、次のクエリを入力します。

query {
    testField
}

次の図に示すように、ヘッダーの再生アイコンボタンをクリックすると、画面に正常な応答が表示されます。

これで、Rails APIアプリケーションがGraphQLで動作するように正常にセットアップされ、GraphQLエンドポイントが動作することを確認するためにテストされました。 次のステップでは、アプリケーションのGraphQLタイプを作成します。

ステップ3—アプリケーションのタイプを作成する

GraphQLは、クエリの検証と応答をタイプとスキーマに依存しています。 このステップでは、メモを取るAPIに必要なメモモデルとGraphQLタイプを作成します。

GraphQLタイプは次のもので構成されます fieldsarguments 次に、そのタイプで動作するGraphQLクエリに表示できるフィールドと引数を定義します。 これらのタイプはGraphQLスキーマを構成します。 GraphQLは、次のタイプを定義します。

  • クエリタイプとミューテーションタイプ:これらは、すべてのGraphQLクエリのエントリポイントを定義する特別なタイプです。 すべてのGraphQLサービスには query タイプし、持っている場合と持っていない場合があります mutation タイプ。
  • オブジェクトタイプ:これらはGraphQLスキーマの基本的なコンポーネントです。 これらは、GraphQLサービスからフェッチできるオブジェクトと、各オブジェクトが保持するフィールドを表します。
  • スカラータイプ:これらは、GraphQLに標準で付属しているデフォルトのタイプです。 それらは含まれています Int, Float, String, Boolean、 と ID.
  • 列挙型:これらは、許可された値の特定のセットを定義する型です。
  • 入力タイプ:これらはオブジェクトタイプに似ていますが、唯一の違いは、クエリに引数として渡すことができるオブジェクトを定義することです。

を含む他のタイプがあります Union, List, Non-Null、 と Interface. 利用可能なGraphQLタイプのリストは、公式のGraphQLドキュメントにあります。

このアプリケーションでは、 Note モデルと Note オブジェクトと入力タイプ。 The Note モデルは、メモを保存するデータベーステーブルを表します。 Note オブジェクトと入力タイプは、に存在するフィールドと引数を定義します Note 物体。

まず、作成します Note を使用したモデル generate model Railsが提供するサブコマンドで、モデルの名前とその列およびデータ型を指定します。 ターミナルウィンドウで次のコマンドを実行します。

  1. rails generate model note title:string:index body:text

このコマンドは、 Note 2つのフィールドを持つモデル: title、タイプ付き string、 と body、タイプ付き text. このコマンドはデータベースも追加します indextitle 桁。 次の2つのファイルが生成されます。

  • A note.rb にあるファイル app/models/note.rb. このファイルには、モデルに関連するすべてのロジックが含まれます。
  • A 20200617173228_create_notes.rb 次の場所にあるファイル(ファイルの先頭の番号は、コマンドを実行した日付によって異なります) db/migrate/20200617173228_create_notes.rb. これは、対応するを作成するための命令を保持する移行ファイルです notes データベース内のテーブル。

移行ファイルの手順を実行するには、 db:migrate 移行ファイルの命令を実行するサブコマンド。 ターミナルウィンドウで次のコマンドを実行します。

  1. rails db:migrate

コマンドが正常に実行されると、次のような出力が表示されます。

Output
== 20200617173228 CreateNotes: migrating ====================================== -- create_table(:notes) -> 0.0134s -- add_index(:notes, :title) -> 0.0073s == 20200617173228 CreateNotes: migrated (0.0208s) =============================

ノートモデルを配置したら、次に、 NoteType. 有効なノートオブジェクトには、 idtitle、 と text. ターミナルウィンドウで次のコマンドを実行して、 NoteType:

  1. rails generate graphql:object Note id:ID! title:String! body:String!

このコマンドは、Railsに次のようなGraphQLオブジェクトタイプを作成するように指示します。 Note 3つのフィールドで: id タイプのフィールド ID、 そしてその titlebody フィールド、それぞれに String タイプ。 感嘆符(!)フィールドタイプに追加されることは、フィールドがnull不可であることを示します。つまり、フィールドがnull値を返すことはありません。 null不可能なフィールドは、GraphQLオブジェクトが照会されるたびにどのフィールドが存在しなければならないかを保証する検証の形式として機能するため、重要です。

上記のコマンドを実行すると、 note_type.rb にあるファイル app/graphql/types/note_type.rb を含む Types::NoteType null許容フィールドが3つあるクラス。

最後に、を作成します NoteInput メモを作成するために必要な引数を定義するために入力します。 を作成することから始めます input 下のディレクトリ app/graphql/types. 入力ディレクトリには、入力タイプが格納されます。

  1. mkdir ~/rails_graphql/app/graphql/types/input

注:入力ディレクトリに入力タイプを作成する必要はありません。 これは単なる一般的な慣習です。 すべてのタイプをtypesディレクトリの下に保持し、クラスを Input あなたがそれにアクセスしているときはいつでもモジュール。

の中に ~/rails_graphql/app/graphql/types/input ディレクトリ、作成 note_input_type.rb ファイル:

  1. nano ~/rails_graphql/app/graphql/types/input/note_input_type.rb

次のコードをファイルに追加して、 Input タイプ:

〜/ rails_graphql / app /graphql/types/input/note_input_type.rb
module Types
  module Input
    class NoteInputType < Types::BaseInputObject
      argument :title, String, required: true
      argument :body, String, required: true
    end
  end
end

の中に note_input_type.rb ファイル、追加しました Types::Input::NoteInputType から継承するクラス Types::BaseInputObject クラスであり、2つの必須の引数を受け入れます。 titlebody、両方の文字列型。

メモを取るアプリ用にモデルと2つのGraphQLタイプを作成しました。 次のステップでは、既存のメモを取得するためのクエリを作成します。

ステップ4—アプリケーションのクエリを作成する

GraphQLを利用したAPIが徐々に統合されています。 このステップでは、2つのクエリを作成します。 1つのノートをフェッチするための1つ id もう1つは、すべてのメモをフェッチします。 GraphQL query typeはデータのフェッチを処理し、RESTのGETリクエストに例えることができます。

まず、すべてのメモを取得するクエリを作成します。 まず、作成します queries すべてのクエリを格納するディレクトリ:

  1. mkdir ~/rails_graphql/app/graphql/queries

の中に app/graphql/queries ディレクトリ、作成 base_query.rb 他のすべてのクエリクラスが継承するファイル:

  1. nano ~/rails_graphql/app/graphql/queries/base_query.rb

次のコードをに追加します base_query.rb 作成するファイル BaseQuery 他のクエリクラスが継承するクラス:

〜/ rails_graphql / app /graphql/queries/base_query.rb
module Queries
  class BaseQuery < GraphQL::Schema::Resolver
  end
end

の中に base_query.rb ファイル、追加しました Queries::BaseQuery から継承するクラス GraphQL::Schema::Resolver クラス。 The GraphQL::Schema::Resolver クラスは、に属するロジックを保持できるコンテナです。 field. に取り付けることができます field とともに resolver: キーワード。

The Queries::BaseQuery クラスには、複数のクエリクラスで再利用する予定のコードを含めることもできます。

次に、 fetch_notes.rb のファイル queries ディレクトリ。 このファイルは、既存のすべてのノートをフェッチするためのロジックを保持し、に添付されます field クエリタイプファイル:

  1. nano ~/rails_graphql/app/graphql/queries/fetch_notes.rb

次のコードをファイルに追加して、戻りオブジェクトタイプを定義し、要求されたメモを解決します。

〜/ rails_graphql / app /graphql/queries/fetch_notes.rb
module Queries
  class FetchNotes < Queries::BaseQuery

    type [Types::NoteType], null: false

    def resolve
      Note.all.order(created_at: :desc)
    end
  end
end

の中に fetch_notes.rb ファイル、作成しました Queries::FetchNotes を継承するクラス Queries::BaseQuery 以前に作成されました。 クラスにはリターンがあります type このクエリによって返されるデータは、作成済みの配列である必要があることを宣言する宣言 NoteType.

The Queries::FetchNotes も含まれています resolve 作成された日付で降順にソートされた既存のすべてのメモの配列を返すメソッド。

The FetchNotes クエリはメモのリクエストを受信して返す準備ができていますが、GraphQLはまだその存在を認識していません。これを修正するには、次の場所にあるGraphQLクエリタイプファイルを開きます。 app/graphql/types/query_type.rb:

  1. nano ~/rails_graphql/app/graphql/types/query_type.rb

The query_type.rb ファイルはすべてのGraphQLのエントリポイントです query 種類。 クエリフィールドとそれぞれのリゾルバメソッドを保持します。 ファイル内のサンプルコードを次のように置き換えます。

〜/ rails_graphql / app /graphql/types/query_type.rb
module Types
  class QueryType < Types::BaseObject
    # Add root-level fields here.
    # They will be entry points for queries on your schema.

    field :fetch_notes, resolver: Queries::FetchNotes
  end
end

の中に query_type.rb ファイル、追加しました fetch_notes フィールドとそれをに添付しました Queries::FetchNotes を使用したクラス resolver:. このように fetch_notes クエリが呼び出され、ロジックを実行します resolve の方法 Queries::FetchNotes クラス。

クエリをテストするには、フェッチするデータが必要ですが、現在データベースにメモがありません。 データベースにシードデータを追加することで、これを修正できます。 を開きます seeds.rb にあるファイル db/seeds.rb:

  1. nano ~/rails_graphql/db/seeds.rb

次のコードをファイルに追加して、5つのメモを作成します。

〜/ rails_graphql / db / seeds.rb
5.times do |i|
  Note.create(title: "Note #{i + 1}", body: 'Lorem ipsum saves lives')
end

コードを追加したら、ファイルを保存して閉じます。

別のターミナルウィンドウでプロジェクトのルートディレクトリを開き、次のコマンドを実行して、 seed.rb ファイル:

  1. rails db:seed

これにより、データベースに5つのメモが作成されます。

データベースにデータがあり、開発サーバーが実行されている状態で、次の場所に移動します。 localhost:3000/graphiql また http://your_server_ip:3000/graphiql ブラウザでGraphiQLIDEを開きます。 エディタの左側に、次のクエリを入力します。

query {
  fetchNotes {
    id
    title
    body
  }
}

このGraphQLクエリは、 query 操作。クエリ要求を行うことを示します。 クエリ操作で、 fetchNotes に一致するフィールド fetch_notes APIで宣言されたクエリフィールドであり、応答で返されるメモのフィールドが含まれています。

ヘッダーの再生アイコンボタンをクリックします。 出力ペインに次のような応答が表示されます。

{
  "data": {
    "fetchNotes": [
      {
        "id": "5",
        "title": "Note 5",
        "body": "Lorem ipsum saves lives"
      },
      {
        "id": "4",
        "title": "Note 4",
        "body": "Lorem ipsum saves lives"
      },
      {
        "id": "3",
        "title": "Note 3",
        "body": "Lorem ipsum saves lives"
      },
      {
        "id": "2",
        "title": "Note 2",
        "body": "Lorem ipsum saves lives"
      },
      {
        "id": "1",
        "title": "Note 1",
        "body": "Lorem ipsum saves lives"
      }
    ]
  }
}

応答には、左側のクエリで宣言されたフィールドに一致する5つのメモの配列が含まれています。 エディターの左側にあるクエリの一部のフィールドを削除してクエリを再実行すると、要求したフィールドのみを含む応答が返されます。 それがGraphQLの力です。

次に、メモを取得するための別のクエリを作成します id. このクエリは、 fetch_notes クエリ、それが受け入れることだけ id 口論。 先に進み、作成します fetch_note.rb クエリディレクトリ内のファイル:

  1. nano ~/rails_graphql/app/graphql/queries/fetch_note.rb

次のコードをファイルに追加して、提供されたメモを見つけて返します id:

〜/ rails_graphql / app /graphql/queries/fetch_note.rb
module Queries
  class FetchNote < Queries::BaseQuery
    type Types::NoteType, null: false
    argument :id, ID, required: true

    def resolve(id:)
      Note.find(id)
    rescue ActiveRecord::RecordNotFound => _e
      GraphQL::ExecutionError.new('Note does not exist.')
    rescue ActiveRecord::RecordInvalid => e
      GraphQL::ExecutionError.new("Invalid attributes for #{e.record.class}:"\
        " #{e.record.errors.full_messages.join(', ')}")
    end
  end
end

これは、 Queries::FetchNote から継承するクラス Queries::BaseQuery クラス。 このクラスは、1つのアイテムを返すだけではありません。 NoteType、それはまた受け入れます id との引数 ID タイプ。 The resolve メソッドは提供されたものを受け取ります id 引数、次に、提供されたメモを見つけて返します id. メモが存在しないかエラーが発生した場合、メモはレスキューされ、として返されます。 GraphQL::ExecutionError.

次に、を添付します Queries::FetchNote クエリタイプファイルのクエリフィールドへのクラス。 を開きます query_type.rb エディター内のファイル:

  1. nano ~/rails_graphql/app/graphql/types/query_type.rb

のリゾルバを定義するファイルに次のコードを追加します fetch_notes:

〜/ rails_graphql / app /graphql/types/query_type.rb
module Types
  class QueryType < Types::BaseObject
    # Add root-level fields here.
    # They will be entry points for queries on your schema.

    field :fetch_notes, resolver: Queries::FetchNotes
    field :fetch_note, resolver: Queries::FetchNote
  end
end

新しいクエリをテストするには、サーバーが実行されていることを確認し、に移動します localhost:3000/graphiql また http://your_server_ip:3000/graphiql ブラウザでGraphiQLIDEを開きます。 エディタの左側に、次のクエリを入力します。

query {
  fetchNote(id: 1) {
    id
    title
    body
  }
}

このクエリ操作は、 fetchNote フィールド、これはに対応します fetch_note クエリフィールド、および渡されます id 口論。 これは、応答で3つのフィールドを返すことを指定します。

ヘッダーの再生アイコンボタンをクリックしてクエリを実行します。 出力ペインに次のような応答が表示されます。

{
  "data": {
    "fetchNote": {
      "id": "1",
      "title": "Note 1",
      "body": "Lorem ipsum saves lives"
    }
  }
}

応答には、要求されたものと一致する単一のメモが含まれています id リクエストのフィールドと一致するフィールドを使用します。

このステップでは、APIからメモをフェッチするためのGraphQLクエリを作成しました。 次に、メモを作成するためのミューテーションを記述します。

ステップ5—メモを変更するためのGraphQLミューテーションの作成

クエリに加えて、GraphQLは mutation サーバー側のデータを変更する操作のタイプ。 RESTが提供するように POST, PUT, PATCH、 と DELETE リソースの作成、更新、削除のリクエスト、GraphQL mutation typeは、サーバー側で書き込みを引き起こす操作の規則を定義します。 このステップでは、新しいノートを追加するためのミューテーションを作成します。

graphQL-ruby 突然変異を書くための2つのクラスが含まれています。 彼らです:

  • GraphQL :: Schema :: Mutation :これはミューテーションを記述するための一般的な基本クラスです。 あなたがしたくない場合 input ミューテーションで引数が必要な場合は、このクラスを使用する必要があります。
  • GraphQL :: Schema :: RelayClassicMutation :これはいくつかの規則がある基本クラスです。 と呼ばれる引数 clientMutationId これは常に応答に挿入され、1つの引数を受け入れるミューテーションは input. このクラスは、を使用するときにデフォルトで使用されます install generator ボイラープレートGraphQLファイルをプロジェクトに追加します。

作成する add_note.rb のファイル mutations にあるディレクトリ app/graphql/mutations:

  1. nano ~/rails_graphql/app/graphql/mutations/add_note.rb

次のコードをファイルに追加して、新しいメモを追加するためのミューテーションを定義します。

〜/ rails_graphql / app /graphql/mutations/add_note.rb
module Mutations
  class AddNote < Mutations::BaseMutation
    argument :params, Types::Input::NoteInputType, required: true

    field :note, Types::NoteType, null: false

    def resolve(params:)
      note_params = Hash params

      begin
        note = Note.create!(note_params)

        { note: note }
      rescue ActiveRecord::RecordInvalid => e
        GraphQL::ExecutionError.new("Invalid attributes for #{e.record.class}:"\
          " #{e.record.errors.full_messages.join(', ')}")
      end
    end
  end
end

これは、 Mutations::AddNote から継承するクラス Mutations::BaseMutation クラスは、実行時に作成されたクラスの1つです。 install generator GraphQL-Rubygemのインストール中。 The Mutations::AddNote クラスは argument 名前で params とのタイプ NoteInputType、ステップ3で作成しました。 また、 field と呼ばれる note null以外である必要があります NoteType タイプ。

The resolve クラスのメソッドは、 params そしてそれをハッシュに変換し、それを使用して新しいメモを含む新しいハッシュを作成して返します。 メモの作成中にエラーが発生した場合、エラーはレスキューされ、として返されます。 GraphQL::ExecutionError.

注: resolve ミューテーションのメソッドは、シンボルが一致するハッシュを返す必要があります field 名前。

クエリと同様に、 Mutations::AddNote ミューテーションは、を使用してミューテーションフィールドにアタッチする必要があります mutation: キーワード。

にあるミューテーションタイプファイルを開きます app/graphql/types/mutation_type.rb エディターで:

  1. nano ~/rails_graphql/app/graphql/types/mutation_type.rb

ファイル内のコードを次のコードに置き換えます。これにより、 add_note 対応するミューテーションクラス:

〜/ rails_graphql / app /graphql/types/mutation_type.rb
module Types
  class MutationType < Types::BaseObject
    field :add_note, mutation: Mutations::AddNote
  end
end

このコードでは、 add_note フィールドをミューテーションタイプファイルに添付し、 Mutations::AddNote を使用したクラス mutation: キーワード。 いつ add_note ミューテーションが呼び出され、コードを実行します resolve の方法 Mutations::AddNote クラス。

新しいミューテーションをテストするには、に移動します localhost:3000/graphiql また http://your_server_ip:3000/graphiql ブラウザでGraphiQLIDEを開きます。 エディタの左側に、次のクエリを入力します。

mutation {
  addNote(input: { params: { title: "GraphQL notes", body: "A long body of text about GraphQL"  }}) {
    note {
      id
      title
      body
    }
  }
}

これは、突然変異操作を宣言します addNote 単一を受け入れるフィールド input 引数は、順番に受け入れます param に一致するキーを持つオブジェクト NoteInputType. 突然変異操作には、 note に一致するフィールド note によって返されるフィールド Mutations::AddNote クラス。

GraphiQLでミューテーションを実行すると、出力ペインに次の結果が表示されます。

{
  "data": {
    "addNote": {
      "note": {
        "id": "6",
        "title": "GraphQL notes",
        "body": "A long body of text about GraphQL"
      }
    }
  }
}

返される応答は、ミューテーション要求で要求されたフィールドを持つ新しく作成されたメモです。

あなたと add_note ミューテーションが機能するようになり、APIはGraphQLクエリとミューテーションを使用してメモをフェッチおよび作成できます。

結論

このチュートリアルでは、データベースとしてPostgreSQLを使用し、APIクエリ言語としてGraphQLを使用して、RubyonRailsでメモを取るAPIアプリケーションを作成しました。 GraphQLの詳細については、公式ウェブサイトをご覧ください。 GraphQL-Ruby gem Webサイトには、RailsでGraphQLを操作するのに役立つガイドもいくつか含まれています。