2017-02-11 3 views
1

でセットアップGraphQLリレーAPIをします。どのように私はGraphQL /リレーのまわりで私の頭をラップしようとしていると私はどのように正しくセットアップリレーに準拠しGraphQLのAPIをRuby on Railsでの使用にを始めるのは難しい見つけることだRailsの

が、私はこれを行う方法の複数のチュートリアルを見つけた:

https://medium.com/react-weekly/relay-facebook-on-rails-8b4af2057152#.gd8p6tbwi

https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-getting-started-955a49d251de#.m05xjvi82

しかし、彼らはすべてこの時点で利用可能ではないようですgraphql-relay宝石を参照してください。 https://github.com/rmosolgo/graphql-relay-ruby

宝石には、relayに固有のセクションがありますが、私はこれを設定してリレークライアントが消費するために必要なことを理解してください。

のRailsでのリレークライアントのGraphQLのAPIを実装する必要は何ですか?

答えて

8

は、私は将来的にはこれで立ち往生し、より良い方向に指摘を取得したいと考えています誰のためにここに私の調査結果を残したいです。

まず、graphql-ruby逸品リレー互換GraphQLのAPIを実装するために必要なすべてが含まれています。ここにはgraphql-relayの宝石の中にあったものがすべて含まれています。あなたがグローバルIDとグローバルをデコードしますobject_from_id方法に、うまく動作するリレー再フェッチ機能を作るために自分のスキーマにドメイン内のオブジェクトに変換id_from_object方法を2つのことを提供する必要が

ApplicationSchema = GraphQL::Schema.define do 
    /* Create IDs by joining the type name & ID, then base64-encoding it */ 
    id_from_object ->(object, type_definition, query_ctx) { 
    GraphQL::Schema::UniqueWithinType.encode(type_definition.name, object.id) 
    } 

    object_from_id ->(id, query_ctx) { 
    type_name, object_id = GraphQL::Schema::UniqueWithinType.decode(id) 
    # Now, based on `type_name` and `id` 
    # find an object in your application 
    # This will give the user access to all records in your db 
    # so you might want to restrict this properly 
    Object.const_get(type_name).find(object_id) 
    } 
end 

また、すべてのあなたのタイプはルビーの宝石によって提供さNodeInterfaceを実装し、代わりにIDタイプのglobal_id_fieldを公開する必要があります:

PostType = GraphQL::ObjectType.define do 
    name "Post" 
    # Implements the "Node" interface for Relay 
    interfaces [GraphQL::Relay::Node.interface] 
    # exposes the global id 
    global_id_field :id 
    field :name, types.String 
end 
アプリケーション内のオブジェクトへのidこれは、リレーは、このようなデータを再フェッチすることができます

:あなたがいないビューで分離されたAPIを構築している場合

query { 
    node(id: "RmFjdGlvbjox") { 
    id 
    ... on Post { 
     name 
    } 
    } 
} 

リレーはまた、生成され、クライアントが利用できることをschema.jsonを必要とするbabel-relay-pluginを使用していますレンダリング、進むべき道は、クライアントがスキーマを取得し、サーバにその仕事をしない、apollo-codegenのようなものが働くことができるようにすることです。あなたはレールのアプリを構築し、同じアプリ内のスキーマを必要としている場合は、あなたはインストロペクエリを実行し、rakeタスクを使用してJSONファイルに結果を保存することができます:

Schema.execute GraphQL::Introspection::INTROSPECTION_QUERY 

最後に、あなた'LLリレー接続で1対多の関係発現することを理解しておく必要があります

PostType = GraphQL::ObjectType.define do 
    # default connection 
    # obj.comments by default 
    connection :comments, CommentType.connection_type 

    # custom connection 
    connection :featured_comments, CommentType.connection_type do 
    resolve ->(post, args, ctx) { 
     comments = post.comments.featured 

     if args[:since] 
     comments = comments.where("created_at >= ?", since) 
     end 

     comments 
    } 
    end 
end 

接続を箱から出して、いくつかの引数をサポートし、あなたの接続クエリでfirstlastbeforeafterを使用することができます。

query { 
    posts(first: 5) { 
    edges { 
     node { 
     name 
     } 
    } 
    } 
} 

これはすべてRelay documentationに記載されていますので、graphql-rubyのドキュメントも必ずお読みください。

0

は、あなたがそれをインストールしてみましたか? Gemfileで

vagrant$ bundle install 
Fetching gem metadata from https://rubygems.org/............ 
Fetching version metadata from https://rubygems.org/... 
Fetching dependency metadata from https://rubygems.org/.. 
Resolving dependencies... 
Installing graphql 0.19.4 
Using bundler 1.11.2 
Installing graphql-relay 0.12.0 
Bundle complete! 1 Gemfile dependency, 3 gems now installed. 
Use `bundle show [gemname]` to see where a bundled gem is installed. 

gem 'graphql-relay' 
+0

はい、動作しますが、古いバージョンの 'graphql'を使用しています。私は 'graphql-ruby'と' graphql-relay'がマージされていることを知りました。私はこの質問にもっと良い答えを与えるためにAPIを構築するのがより快適になるよう努めています。それを始めるには間違いなく苦痛です –

関連する問題