URL参数和控制器中的if else检查太多

时间:2011-08-08 20:19:16

标签: ruby-on-rails ruby

我想这是一个架构查询。

我正在构建一个购物网站,当用户看到结果页面时,他们可以按价格,尺寸,品牌,商店等进行过滤。我这样做的方法是将过滤器发送到网址 - 这样可以正常工作。但是 -

我的控制器(实际上最近将这个逻辑移到模型中)有很多if else语句很疯狂。我目前的实施有:

    ########   different rhs scenarios    ######## 
     if params[:brand] and params[:store]
        @products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:store => "#{params[:store]}", :brand => "#{params[:brand]}"})
     elsif params[:store]
       @products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:store => "#{params[:store]}"})
     elsif params[:brand]
          @products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:brand => "#{params[:brand]}"})
     elsif params[:price]
           @products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:price => "#{params[:price]}"})
     else
       @products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page])
    end

这基本上意味着我需要拥有所有组合:

1)搜索

2)搜索+价格

3)搜索+品牌

4)搜索+商店

5)搜索+大小

6)重复品牌/商店等!!

这可能不对,当然我不需要为每个可能的组合编程?我最近发现了params.merge,看起来至少在前端它可以帮助我。我有点像菜鸟,它让我觉得这可能是设计模式的用武之地。

有人能指出我正确的方向吗?

提前感谢您的所有帮助。

3 个答案:

答案 0 :(得分:1)

新解决方案:

options = {}
options.merge!(:store => params[:store]) unless params[:store].blank?
options.merge!(:store => params[:price]) unless params[:price].blank?
options.merge!(:store => params[:brand]) unless params[:brand].blank?
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => options

答案 1 :(得分:0)

查看Ryan Bates关于“Refactoring& DynamicDelegator”的截屏视频。它会让你对清理这类东西有个好主意。 Refactoring & DynamicDelegator

答案 2 :(得分:0)

更好的模式可能涉及有选择地添加范围,看起来像这样:

products = Products.scoped
products = products.search(params[:q]) if params[:q]
products = products.store(params[:store]) if params[:store]
products = products.brand(params[:brand]) if params[:brand]