0

これは実際には、Rails で Roar と表現可能を使用するためのベスト プラクティス/使用法に関する質問です。その例は見つかりませんでした。ここに 2 つのシナリオがあります。デコレータパターンを使用しています。

シナリオ 1:

複数の属性と関連付けを持つ Product クラスがあるとします。デフォルトでは、誰かが api.com/products/1 にリクエストしたとき - 私が持っているものすべてを表示したいのですが、誰かが api.com/products/1/inventory_details のような別のアクションにリクエストした場合 - 私は欲しいだけです在庫に関連する限定的なビューを表示するため (在庫検索を高速化するため)、または誰かが api.com/products/1/assembly_details にリクエストを行った場合 - 関連するサブアセンブリのマトリックスと関連する製品の詳細を返したい.

シナリオ 1 に関する質問:

  1. ProductRepresenter、ProductInventoryDe​​tailRepresenter、ProductAssemblyDetailRepresenter など、ケースごとに特定のリプレゼンテーションを作成する必要がありますか?それとも、ProductRepresenter である種のフロー制御を使用する必要がありますか?
  2. 複数のリプレゼンテーションを作成する場合、同じクラスに対して、represents / Respond_with pattern と Respond_to / render をどのように使用できますか?
  3. これをアクション レベルでオーバーライドできますか?

シナリオ 2:

内部アプリケーションから呼び出すことができる api.com/products/1 があるとしますが、クライアントにも公開したいとします。ただし、在庫の詳細や 1 つまたは 2 つの属性など、一部の属性をクライアントに表示したくありません。また、従業員のアクセス レベルに応じて、ビュー/表現を制限したいと考えています。

シナリオ 2 に関する質問:

  1. ProductRepresenter、ProductClientViewRepresenter など、ケースごとに特定のリプレゼンテーションを作成する必要がありますか?それとも、ProductRepresenter である種のフロー制御を使用する必要がありますか?
  2. 複数のリプレゼンテーションを作成する場合、同じクラスに対して、represents / Respond_with pattern と Respond_to / render をどのように使用できますか?
  3. これをアクション レベルでオーバーライドできますか? アクセス タイプに基づいて、admin、inventory_user、shipping_user のように指定できますか?

アドバイスをいただければ幸いです。(Roar-Rails gem の github にこれをクロスポストします)

4

1 に答える 1

3

シナリオ 1 :

  1. ProductRepresenter、ProductInventoryDe​​tailRepresenter、ProductAssemblyDetailRepresenter など、ケースごとに特定のリプレゼンテーションを作成する必要がありますか?それとも、ProductRepresenter である種のフロー制御を使用する必要がありますか?

はい、別のクラスを使用してください。if:バニラ Rails で行われているような、and else などのがらくたから始めないでください。コンテキストごとに 1 つのリプレゼンテーション クラスが正しいと思います。ただし、共通のプロパティを共有するには、モジュールを使用し、それらをデコレータに含める必要があります。

  1. 複数のリプレゼンテーションを作成する場合、同じクラスに対して、represents / Respond_with pattern と Respond_to / render をどのように使用できますか?

そのために ::represents を使用できます。roar-rails を参照してください。

  1. これをアクション レベルでオーバーライドできますか?

繰り返しますが、roar-rails のドキュメントを確認するrespond_withrender、代表者を明示的に設定できます。

シナリオ 2 に関する質問:

  1. ProductRepresenter、ProductClientViewRepresenter など、ケースごとに特定のリプレゼンテーションを作成する必要がありますか?それとも、ProductRepresenter である種のフロー制御を使用する必要がありますか?

特定のプロパティを非表示にするだけの場合は、実際に試して:if、レンダリング/解析呼び出しにコンテキストを挿入できます。

object.to_json(context: "admin")

property :title, if: ->(options) { options[:context] == "admin" }

ただし、:if常に決定者の混乱に陥るので、一般的には強く思いとどまらせます。コンテキストなどを使用して、この問題を一般的なレベルで解決する方法を見つけることができるかもしれません。

  1. および 3.、上記を参照してください。
于 2015-05-08T22:07:34.607 に答える