2012-05-09 3 views
0

REST API用のRubyバインディングに取り組んでおり、その一部として慣用Rubyと見なされています。簡単な例で説明するためにIdiomatic Rubyは、親を認識しているツリー内のノードを表すオブジェクトを作成するためのものです。

は、APIによって表されるリソースがツリー構造を形成する:

  root 
      /\ 
     /\ 
     / \ 
     group group  
     /  /\ 
    / /\ 
    / / \ 
project project project 

は子供の新しいインスタンスを作成するには、その親の知識が必要とされます。たとえば、新しいグループを作成するには、ルートの知識が必要です。ルートからグループを作成するためのURIを取得できるようにします。

私は、読み取りアクセス権を持つ合理的に満足している:それは私はわからない程度だ新しいリソースを作成しています

api = Api.new(...) 
api.groups # An array of all groups 
api.groups.select(...).projects # An array of all a group's projects 

私は配列サブクラスのメソッドを作成したと考えられてきました:

group = api.groups.create("group-name") 
project = group.projects.create("project-name") 

コンストラクタの引数として親を取って、直接タイプのインスタンス化:

group = Group.new(api, "project-name") 
project = Project.new(group, "project-name") 

は、親のメソッドを作成します。

group = api.create_group("group-name") 
project = group.create_project("project-name") 

上記3つのアプローチのうち、私はそれがc onciseを使用して、作成を連鎖させることができます。 3番目のオプションは似ていますが、REST APIの点では、作成がグループの作成を許可するグループリソースであるため、間違ったレベルで発生しています。つまり、私は経験豊富なRuby開発者ではなく、まずRuby APIがREST APIのモデルと正確に一致しない場合でも、Ruby APIがRuby開発者にとって慣れ親しんでいることを願っています。

答えて

0

これは、コードサンプルと説明がRESTにして絆を提供する方法を私に明確ではないのですが、私は私が理解しない何で私の2セントを提供します:

私はそれを組み合わせて使用​​することを完全に有効なことだと思いますすべての3つの何が慣用的であろうと、私はRails association methodsからあなたの手がかりを取ります。

api.groups.createは、Rails 'has_manyの構文に従います。 api.create_groupおよびgroup.create_projectは、has_oneの構文に従います。 create/create_associationという構文的な砂糖の下には、とにかくすべてのクラスへの参照を結びつけるために合成を使用していると仮定しているので、Group.new(api, "group-name")/Project.new(group, "project-name")も完全に有効なオプションのようです。 3つのアプローチをすべて有効に使うことはできないというルールはありません(そしてRailsもそうです)。

Rubyの基底クラスをサブクラス化することを避けることをお勧めします。必要に応じて作文を使用して委任してください。

+0

Railsの関連付けメソッドへのポインタをありがとう。謝罪、私の最初の例の2行目はタイプミスでした。それは、group.projects.create( "project-name")を読み込んでいるはずです。私は上記を訂正しました。 –

+0

確かです。私はあなたの今修正された入力ミスを参照して私の答えの部分を削除しました。私の答えが十分に満足していれば、それを受け入れることが大いに感謝されるでしょう! – Cade

関連する問題