这实际上是关于hwo的最佳实践/使用问题,使用Roar&在Rails中可以表示,因为我没有找到任何这样的例子。这是两个场景。我使用装饰模式。
假设我有一个具有多个属性的产品类&协会。默认情况下,有人向api.com/products/1发出请求 - 我想展示我所拥有的一切,但是如果有人向另一个动作提出请求,例如api.com/products/1/inventory_details - 我只想要显示与库存有关的有限视图(使库存查找更快)或者如果有人向api.com/products/1/assembly_details发出请求 - 我想返回相关子组件的矩阵以及一些相关的产品详细信息
假设我有api.com/products/1,我的内部应用程序都可以调用,但我也希望向我的客户公开。但是,我不希望我的客户看到一些属性,如库存详细信息或可能只有一两个属性。另外,根据员工的级别访问权限,我想限制他们的观点/表示。
任何建议都会得到满足。 (我将在Roar-Rails gem的github上交叉发布)
答案 0 :(得分:3)
情景1:
- 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductInventoryDetailRepresenter,ProductAssemblyDetailRepresenter或我在ProductRepresenter中使用某种流量控制?
醇>
是的,请使用单独的课程。不要以if:
和其他方式开始,以及在vanilla Rails中完成的那种废话。每个上下文的一个代表类是我认为正确的。但是,您应该使用模块并将它们包含在装饰器中以共享公共属性。
- 如果我为同一个类创建多个表示者,我如何使用表示/ respond_with模式与respond_to / render?
醇>
你可以使用::代表,参见roar-rails。
- 我可以在行动级别覆盖此内容吗?
醇>
再次,检查roar-rails中respond_with
和render
的文档,它们允许明确设置代表。
场景2的问题:
- 我是否为每个案例创建一个特定的代表,如ProductRepresenter,ProductClientViewRepresenter,或者我是否在ProductRepresenter中使用某种流控制?
醇>
如果它只是隐藏某些属性,您实际上可以尝试使用:if
并将上下文注入到呈现/解析调用中。
object.to_json(context: "admin")
property :title, if: ->(options) { options[:context] == "admin" }
然而,我总体上强烈反对:if
因为总是在一群决策者中结束。在github上打我,也许我们可以找到一种方法来解决这个问题的一般水平,上下文等?