在GraphQL模式中获取上下文

时间:2019-10-31 07:15:38

标签: ruby-on-rails ruby graphql graphql-ruby

我正在使用graphql-ruby并试图在这种模式下保护管理员的变异

class MySchema < GraphQL::Schema

  mutation(Types::Admin::MutationType) if context[:current_user].admin?

  mutation(Types::MutationType)
  query(Types::QueryType)

end

但是我那里没有上下文。 还尝试在Types::Admin::MutationType中做相同的事情,得到相同的结果。

在解决之前是否可以在任何地方签出上下文?

1 个答案:

答案 0 :(得分:0)

here是我发现的最好甚至最好的指南之一。它提供了广泛的文档和指南。尝试使用self.visible?(ctx)方法。我也觉得您是在与宝石作战,而不是与之作战。尝试按照以下概述的方式重组代码。使用起来可能会更容易。

context方法上调用execute对象之前,不会将其附加到架构。这通常发生在您的“ app / controllers / graphql_controller.rb”文件中。因此,总的来说,在应用程序执行架构之前,您将无法访问“上下文”对象。由于假设您使用了内置代码生成工具,因此在执行QueryType和MutationType附加后,您可能需要执行以下操作。


# '/app/graphql/my_schema.rb'

class MySchema < GraphQL::Schema
  mutation(Types::MutationType)
  query(Types::QueryType)
end

# '/app/graphql/types/mutation_type.rb'
class Types::MutationType < Types::BaseObject
  field :some_admin_mutation, mutation: Mutations::Admin::SomeAdminMutation
end


# '/app/graphql/mutations/admin/some_admin_mutation.rb'
class Mutations::Admin::SomeAdminMutation < Mutations::BaseMutation
  ...

   # using this class method, you can choose to hide certain mutations
   def self.visible?(context)
      context[:current_user].admin?
   end
end

使用以下graphql查询进行测试(我在Chrome中使用apollo)

{
  __schema {
    mutationType {
      name
      fields {
        name
      }
    }
  }
}