无法写入未知属性`client_mutation_id`

AbU*_*dZu 4 ruby ruby-on-rails graphql

我正在尝试使用 RoR 在 Graphql 中编写我的第一个突变。看起来像这样:

应用程序/graphql/mutations/create_post.rb

module Mutations
    class CreatePost < Mutations::BaseMutation
        argument :title, String, required: true
        argument :body, String, required: true

        type Types::PostType

        def resolve(title: nil, body: nil)
            Post.create!(title: title, body: body)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

但是每次我使用Graphiql提出请求时(像这样:)

mutation createPost {
  createPost(input:{
    title:"dupa",
    body:"dupa"
  }) {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

帖子被保存在数据库中,但我收到一个错误

"error": {
    "message": "can't write unknown attribute `client_mutation_id`" [...]
Run Code Online (Sandbox Code Playgroud)

而不是请求的 id 我该如何解决这个问题?这是我的

应用程序/graphql/mutations/base_mutation.rb

module Mutations
    class BaseMutation < GraphQL::Schema::RelayClassicMutation
    end
end
Run Code Online (Sandbox Code Playgroud)

应用程序/graphql/types/mutation_type.rb

module Types
  class MutationType < Types::BaseObject
    field :create_post, mutation: Mutations::CreatePost
  end
end
Run Code Online (Sandbox Code Playgroud)

github 链接是否有帮助:https : //github.com/giraffecms/GiraffeCMS-backend-rails/tree/blog/app/graphql

Dav*_*aze 8

继电器输入对象的突变规范规定了什么突变投入和产出的样子,有的要求graphql,红宝石会产生一些这方面的样板给你。特别是,您没有直接指定type突变响应的 graphql-ruby 为您生成“有效负载”类型,您必须指定field进入其中的s。

也就是说,我认为应该这样说:

class Mutations::CreatePost < Mutations::BaseMutation
    argument :title, String, required: true
    argument :body, String, required: true

    field :post, Types::PostType, null: false

    def resolve(title: nil, body: nil)
        post = Post.create!(title: title, body: body)
        { post: post }
    end
end
Run Code Online (Sandbox Code Playgroud)

API 文档说明(强调来自原文):

所谓的争论clientMutationId一直增加,但它不是传递给方法的决心。该值被重新插入到响应中。(用于客户端库管理乐观更新。)

因此,当您的原始版本尝试直接返回模型对象时,graphql-ruby 会尝试对其进行设置#client_mutation_id,这会导致您收到错误。