内容
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.