【问题标题】:Should I recreate the model of a Ruby on Rails 3 Application to fit an expected REST Service?我应该重新创建 Ruby on Rails 3 应用程序的模型以适应预期的 REST 服务吗?
【发布时间】:2011-06-28 12:26:49
【问题描述】:

我正在创建一个非常简单的 Web 应用程序,我能够利用许多标准 Ruby on Rails 3 功能(添加和删除模型元素等)。

现在我想提供一个 REST 服务,它在一个流中返回元素的层次结构。

例如,在我的模型中:

  • ProductType,它定义了允许的 ComponentType 组合。 例如:礼品篮,定义为有几个酒瓶和 3 个水果。
  • 组件类型。 例如:水果、酒瓶等
  • 组件:这些是 ComponentTypes 的体现。 例如:长相思、苹果、梨等。

现在我想提供一个“菜单”休息服务,它显示这些的层次结构。它应该看起来像这样:

  "menu": [
{ "name":"Gift basket", "description":"some description", "price": 0, "isDefaultSelected": false, "isMultiselect":false ,"isContainer":true, "children":[
  { "name":"Wine", "description":"", "price": 0, "isDefaultSelected": false, "isMultiselect":false ,"isContainer":true, "children":[
    { "name":"Sauvignon Blanc", "description":"...", "price": 170, "isDefaultSelected": true, "isMultiselect":false, "isContainer":false },
    { "name":"Merlot", "description":"...", "price": 170, "isDefaultSelected": false, "isMultiselect":false ,"isContainer":false }
  ]
  },
  { "name":"Fruit", "description":"Fruits...", "price": 0, "isDefaultSelected": false, "isMultiselect":false ,"isContainer":true, "children":[
    { "name":"Apple", "description":"...", "price": 170, "isDefaultSelected": true, "isMultiselect":false ,"isContainer":false },
    { "name":"Pear", "description":"...", "price": 170, "isDefaultSelected": false, "isMultiselect":false ,"isContainer":false }
  ]
  }
]
}

由此,客户端将创建一个菜单,其中具有“isMultiselect”属性的项目是复选框。有些属性可以说是多余的(isMultiselect 可能只是位于层次结构的较高部分),但我们要求所有元素都相同。

所以我的问题是我是否应该创建一个新模型来表示我想在我们的 REST 服务中拥有的对象,或者我是否可以以符合上述 JSON 模式的方式呈现我拥有的对象。

【问题讨论】:

    标签: ruby-on-rails ruby web-services json rest


    【解决方案1】:

    有点不清楚“菜单”是什么。它只是 ProductTypes 的列表吗?是否有多个菜单?

    至于一般问题 - 是的,您应该能够使用为您的 JSON 提要定义的现有资源。如果您需要自定义 JSON 提要(例如,包含子资源),您可以使用 respond_with 方法:

    respond_to :html, :json
    
    def show
       @product_types = ProductType.all
    
       respond_with(@product_types, :include => [:component_types => :components])
    end
    

    【讨论】:

    • 未来可能会有不同的菜单。现在它应该是一个菜单,用户可以从中选择 products_types,配置它们(通过选择组件作为产品类型的体现的一部分),然后将它们添加到购物车中。
    【解决方案2】:

    我建议查看awesome_nested_set gem,看看您是否可以以这种方式表示您的层次结构。基本上,您必须在现有模型中添加 3 个新列,然后才能获得所有标准树支持。然后你可以添加一两个简单的路由到相关的控制器,你应该可以开始了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2011-10-29
      • 1970-01-01
      • 2017-03-07
      • 2016-06-12
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多