在使用Ruby的“gem graphql-client”时,我在定义片段时遇到了困难
请将以下内容以纯中文的方式进行释义,只需要一个选项:
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'
...
(出现这种错误)
最终结论
对策有以下两种选择。
-
- 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
后一种方法需要更改引用在查询中的片段。
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=此方式适用于命名空间常量。