0

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

场景一:

假设我有一个具有多个属性和关联的 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. 如果我为同一个类创建多个代表,我如何使用代表/respond_with 模式与 respond_to/render ?
  3. 我可以在操作级别上覆盖它吗?

场景二:

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

方案 2 的问题:

  1. 我是为每个案例创建一个特定的表示器,例如 ProductRepresenter、ProductClientViewRepresenter,还是在 ProductRepresenter 中使用某种流控制?
  2. 如果我为同一个类创建多个代表,我如何使用代表/respond_with 模式与 respond_to/render ?
  3. 我可以在操作级别上覆盖它吗 - 基于访问类型,例如:admin vs inventory_user vs shipping_user?

任何建议都会被采纳。(我将在 Roar-Rails gem 的 github 上交叉发布此内容)

4

1 回答 1

3

方案 1:

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

是的,请务必使用单独的课程。不要从if:and else 开始,就像在 vanilla Rails 中所做的那样。我认为每个上下文一个代表类是正确的。但是,您应该使用模块并将其包含到装饰器中以共享公共属性。

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

您可以为此使用 ::represents,请参阅 roar-rails。

  1. 我可以在操作级别上覆盖它吗?

再次,检查文档respond_withrenderroar-rails,它们允许显式设置表示器。

方案 2 的问题:

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

如果只是隐藏某些属性,您实际上可以尝试:if将上下文注入渲染/解析调用。

object.to_json(context: "admin")

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

但是,总的来说,我强烈建议不要这样做:if,因为它总是以一团糟的决策者告终。在 github 上联系我,也许我们可以找到一种方法在一般层面上解决这个问题,使用上下文等?

  1. 和 3.,见上文。
于 2015-05-08T22:07:34.607 回答