使用ROAR gem根据标准为同一个类创建多个表示的策略?

时间:2015-05-08 15:06:32

标签: ruby-on-rails json rails-roar representable

这实际上是关于hwo的最佳实践/使用问题,使用Roar&在Rails中可以表示,因为我没有找到任何这样的例子。这是两个场景。我使用装饰模式。

场景1:

假设我有一个具有多个属性的产品类&协会。默认情况下,有人向api.com/products/1发出请求 - 我想展示我所拥有的一切,但是如果有人向另一个动作提出请求,例如api.com/products/1/inventory_details - 我只想要显示与库存有关的有限视图(使库存查找更快)或者如果有人向api.com/products/1/assembly_details发出请求 - 我想返回相关子组件的矩阵以及一些相关的产品详细信息

方案1的问题:

  1. 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductInventoryDe​​tailRepresenter,ProductAssemblyDetailRepresenter或我在ProductRepresenter中使用某种流量控制?
  2. 如果我为同一个类创建多个表示者,我如何使用表示/ respond_with模式与respond_to / render?
  3. 我可以在行动级别覆盖此内容吗?
  4. 场景2:

    假设我有api.com/products/1,我的内部应用程序都可以调用,但我也希望向我的客户公开。但是,我不希望我的客户看到一些属性,如库存详细信息或可能只有一两个属性。另外,根据员工的级别访问权限,我想限制他们的观点/表示。

    方案2的问题:

    1. 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductClientViewRepresenter,或者我是否在ProductRepresenter中使用某种流控制?
    2. 如果我创建多个表示者,对于同一个类,我如何使用表示/ respond_with模式与respond_to / render?
    3. 我可以在操作级别覆盖此操作 - 基于访问类型,例如:admin vs inventory_user vs shipping_user?
    4. 任何建议都会得到满足。 (我将在Roar-Rails gem的github上交叉发布)

1 个答案:

答案 0 :(得分:3)

情景1:

  
      
  1. 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductInventoryDe​​tailRepresenter,ProductAssemblyDetailRepresenter或我在ProductRepresenter中使用某种流量控制?
  2.   

是的,请使用单独的课程。不要以if:和其他方式开始,以及在vanilla Rails中完成的那种废话。每个上下文的一个代表类是我认为正确的。但是,您应该使用模块并将它们包含在装饰器中以共享公共属性。

  
      
  1. 如果我为同一个类创建多个表示者,我如何使用表示/ respond_with模式与respond_to / render?
  2.   

你可以使用::代表,参见roar-rails。

  
      
  1. 我可以在行动级别覆盖此内容吗?
  2.   

再次,检查roar-rails中respond_withrender的文档,它们允许明确设置代表。

场景2的问题:

  
      
  1. 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductClientViewRepresenter,或者我是否在ProductRepresenter中使用某种流控制?
  2.   

如果它只是隐藏某些属性,您实际上可以尝试使用:if并将上下文注入到呈现/解析调用中。

object.to_json(context: "admin")

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

然而,我总体上强烈反对:if因为总是在一群决策者中结束。在github上打我,也许我们可以找到一种方法来解决这个问题的一般水平,上下文等?

  1. 和3.,见上文。