在使用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=此方式适用于命名空间常量。

广告
将在 10 秒后关闭
bannerAds