【问题标题】:Cleanest way of implementing conditional view logic in an application在应用程序中实现条件视图逻辑的最简洁方法
【发布时间】:2011-11-03 19:56:16
【问题描述】:

我正在设计一个应用程序,用户将从产品列表中进行选择并将它们添加到购物车中。服务将按类别分组呈现给用户。

并不总是显示相同的产品和类别列表。它们每天都在变化。

这一切都很好,棘手的部分是有选择数量的类别,当显示时,需要稍微改变应用程序的行为。

例如,假设我们有 3 个类别,类别 A、B 和 C。 任何时候显示 B 类,它都必须出现在 A 类上方的屏幕上。 每当用户从 B 类中选择产品时,他们也必须从 C 类中选择产品。 如果未显示 B 类,则这些规则均不适用。

需要注意的一点是,服务和类别列表来自第三方 Web 服务,因此添加或更改数据库列的余地很小。

实现这种逻辑的最简洁的方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 architecture


    【解决方案1】:

    这大部分都可以在控制器或模型中解决。

    那么:关于哪些类别显示在哪些其他类别之上的逻辑只是类别的排序顺序,是吗?因此,您可以在 Category 模型上保留一个“排序列”并按此字段对其进行排序。

    “如果选择其中之一,则必须选择其中之一”更棘手 - 但绝对是基于模型的验证。我想你有某种“订单”模型来将用户放入购物篮的东西放在一起? 添加类似于以下内容的验证方法:

    validate :product_b_and_product_c
    
    def product_b_and_product_c
      if self.products.any? {|p| p.category == 'category_b' }
        errors.add_to_base "must choose product from cat C if you have one in cat B" unless self.products.any? {p| p.category == 'category_c' }
       end
    end
    

    【讨论】:

    • 感谢您的回复。我没有提到的一件事是类别和服务来自第三方休息服务,因此我无法添加新的 db 列。我已经更新了这个问题。
    • 好的,所以这会影响排序......如果需要,您确实可以将逻辑放入视图(或最好是控制器)以影响排序后获取。上面的验证怎么样?
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多