0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rubyの「gem graphql-client」を使用しているときにfragmentの定義でハマった

Posted at

内容

github: https://github.com/github/graphql-client

以下のように定義したら、

HumanFragment = SWAPI::Client.parse <<-'GRAPHQL'
  fragment on Human {
    name
    homePlanet
  }
GRAPHQL

こんな感じで使えるgithubには書いてあるのに使えない。

HeroNameQuery = SWAPI::Client.parse <<-'GRAPHQL'
  {
    luke: human(id: "1000") {
      ...HumanFragment
    }
    leia: human(id: "1003") {
      ...HumanFragment
    }
  }
GRAPHQL

そんな時の対処法。

... uninitialized constant HumanFragment (GraphQL::Client::ValidationError)
	from /home/vagrant/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/graphql-client-0.18.0/lib/graphql/client.rb:147:in `gsub'
	from /home/vagrant/.rbenv/versions/3.0.4/lib/ruby/gems/3.0.0/gems/graphql-client-0.18.0/lib/graphql/client.rb:147:in `parse'
    ...

(こんなエラーが出る)

結論

対処法は以下の2つ。

  • fragmentをトップレベルの定数として定義する
  • その定数が定義されているfragmentのNameSpaceをしっかりと書いてあげる

具体的には

自分の場合はgemを作っていたので、以下のような構成でプログラムを考えてました

module Hoge
  class FugaClient
    ...

    DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            ...DogFragment
          }
        }
      }
    GRAPHQL
  end
end

でもこれだとエラーになってしまいます。前述の対処法の、どちらにも当てはまっていません。

  • fragmentをトップレベルの定数として定義する
  • その定数が定義されているfragmentのNameSpaceをしっかりと書いてあげる

具体的に修正すると、前者の方法であればfragmentの定義方法を若干変えてあげることになる。

module Hoge
  class FugaClient
    ...

    # ここを修正
    ::DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            ...DogFragment
          }
        }
      }
    GRAPHQL
  end
end

後者の方法では、query内で参照しているfragmentを変えてあげないといけない。

module Hoge
  class FugaClient
    ...

   DogFragment = GraphQL::Client.parse(<<~GRAPHQL)
      fragment on Dog {
        id
        name
        type
      }
    GRAPHQL

    GetDogQuery = GraphQL::Client.parse(<<~GRAPHQL)
      query {
        getAnimal(type: "dog") {
          dog {
            # ここを修正
            ...Hoge::FugaClient::DogFragment
          }
        }
      }
    GRAPHQL
  end
end

凡ミスでしたね。

後からREADMEを見返してみると、以下の部分に書いてあることがこの内容を解決するものでした。

最初は意味が理解できなかったんですが、こういうことだったんですね。

https://github.com/github/graphql-client#:~:text=This%20works%20for%20namespaced%20constants.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?