GraphQL-Ruby でCRUD処理(後編)
GraphQL-Ruby で CRUD 処理 前編 に引き続き、GraphQL-Ruby を使用して CRUD 処理を実装していきます。
今回は CRUD 処理の Create, Update, Delete に相当する mutation を実装していきます。
環境
- Ruby 2.7.5
- Rails 6.1.7
- GraphQL-Ruby 1.11.6
マイクロポストを作成する Mutation の実装
マイクロポストを作成する Mutation を実装します。Mutation を実行するには以下の手順が必要になります。
- マイクロポストを作成する Mutation の作成
- Mutation の公開
1. マイクロポストを作成する Mutation の作成
app/graphql/mutations/create_micropost.rb
を新規で作成します。
module Mutations
class CreateMicropost < BaseMutation
argument :content, String, required: false
field :micropost, Types::MicropostType, null: false
def resolve(content: nil)
{
micropost: Micropost.create!(
content: content
)
}
end
end
end
引数(arugument)としては contect を受け取り、resolve の中でマイクロポストの作成を行います。
さらに戻り値としては micropost をレスポンスできるようにしています。
2. Mutation の公開
手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb
を修正します。
module Types
class MutationType < Types::BaseObject
+ field :create_micropost, mutation: Mutations::CreateMicropost
end
end
create_micropost
field と手順 1 で作成した CreateMicropost Mutation を紐づけています。
実行する
http://localhost:3000/graphiql で実行結果を確認できます。
mutation CreateMicropost($CreateMicropostInput:CreateMicropostInput!) {
createMicropost(input: $CreateMicropostInput){
micropost {
id
content
}
}
}
variable としては以下の json を設定します。
{
"CreateMicropostInput": {
"content": "サンプル3"
}
}
実行すると作成した micropost がレスポンスされるはずです。
{
"data": {
"createMicropost": {
"micropost": {
"id": "3",
"content": "サンプル3"
}
}
}
}
マイクロポストを更新する Mutation の実装
マイクロポストを更新する Mutation を実装します。作成と同様に、Mutation を実行するには以下の手順が必要になります。
- マイクロポストを更新する Mutation の作成
- Mutation の公開
1. マイクロポストを更新する Mutation の作成
app/graphql/mutations/update_micropost.rb
を新規で作成します。
module Mutations
class UpdateMicropost < BaseMutation
argument :id, ID, required: true
argument :content, String, required: false
field :micropost, Types::MicropostType, null: false
def resolve(id: nil, content: nil)
micropost = Micropost.find(id)
micropost.content = content if content != nil
micropost.save!
{ micropost: micropost }
end
end
end
引数(argument)としては、更新するマイクロポストを選択するための id と、更新対象のカラムである content の値を受け取ります。
resolve の中では、取得した id を元に更新対象のマイクロポストを取得し、content の更新を行なっています。
2. Mutation の公開
手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb
を修正します。
module Types
class MutationType < Types::BaseObject
field :create_micropost, mutation: Mutations::CreateMicropost
+ field :update_micropost, mutation: Mutations::UpdateMicropost
end
end
update_micropost
field と手順 1 で作成した UpdateMicropost Mutation を紐づけています。
実行する
http://localhost:3000/graphiql で実行結果を確認できます。
mutation UpdateMicropost($UpdateMicropostInput:UpdateMicropostInput!) {
updateMicropost(input: $UpdateMicropostInput){
micropost {
id
content
}
}
}
variable としては以下の json を設定します。
{
"UpdateMicropostInput": {
"id": 3,
"content": "サンプル333"
}
}
実行すると更新した micropost がレスポンスされるはずです。
{
"data": {
"updateMicropost": {
"micropost": {
"id": "3",
"content": "サンプル333"
}
}
}
}
マイクロポストを削除する Mutation の実装
マイクロポストを削除する Mutation を実装します。作成と同様に、Mutation を実行するには以下の手順が必要になります。
- マイクロポストを削除する Mutation の作成
- Mutation の公開
1. マイクロポストを削除する Mutation の作成
app/graphql/mutations/delete_micropost.rb
を新規で作成します。
module Mutations
class DeleteMicropost < BaseMutation
argument :id, ID, required: true
field :id, ID, null: false
def resolve(id: nil)
Micropost.find(id).destroy
{ id: id }
end
end
end
2. Mutation の公開
手順 1 で作成した Mutation を公開します。 app/graphql/types/mutation_type.rb
を修正します。
module Types
class MutationType < Types::BaseObject
field :create_micropost, mutation: Mutations::CreateMicropost
field :update_micropost, mutation: Mutations::UpdateMicropost
+ field :delete_micropost, mutation: Mutations::DeleteMicropost
end
end
delete_micropost
field と手順 1 で作成した DeleteMicropost Mutation を紐づけています。
実行する
http://localhost:3000/graphiql で実行結果を確認できます。
mutation DeleteMicropost($DeleteMicropostInput:DeleteMicropostInput!) {
deleteMicropost(input: $DeleteMicropostInput){
id
}
}
variable としては以下の json を設定します。
{
"DeleteMicropostInput": {
"id": 3
}
}
実行すると削除した micropost がの ID がレスポンスされるはずです。
{
"data": {
"deleteMicropost": {
"id": "3"
}
}
}
最後に
今回は GraphQL-Ruby で CRUD 処理を実装してみました。
Rails で思ったよりもサクッと GraphQL の API サーバーを作ることができ、今後も利用していきたいと思っています。
参考
Building a GraphQL Server with Ruby Backend Tutorial | Intro
Discussion