在单元格中处理请求/访问数据库是一种好习惯吗?以及有关单元格和OOP的MVC的更多信息

时间:2012-10-07 15:02:31

标签: ruby-on-rails oop model-view-controller search rails-cells

我只是想知道这是否是在单元格定义中制作模型请求的好方法....?

我还需要一般地定义从OOP的角度来看,在不同的上下文中为搜索结果实现不同表示的更方便的方法。

我需要做什么?

我有项目的类别。我想将搜索结果作为单元格实现。 根据三种情况,搜索结果应以不同的方式表示:

  • 搜索指定类别中的所有项目

E.g。让类别为“动物”(此类别包含:数据库中的狗,猫和鸟类物品)然后我应该在浏览器中看到:

 Category Items
    dog
    cat
    bird
  • 在所有类别中搜索与指定“模式”类似的项目

例如,让模式为“做”:

Similar Items
   Animals
      dog
   Cars
      dodge
  • 在指定的“类别”
  • 中搜索与指定“pattern”类似的项目

E.g。让模式为“做”,类别为“动物”:

Category Items
    dog
Similar Items
    Cars
       dodge

我决定尝试使用细胞宝石来实现这些东西...

这是我想通过单元格显示的内容: (应用程序/细胞/ search_result / display.html.haml)

%h1
  = @category_items[:title]
%ul
  - for i in @category_items[:items]
    %li
      = link_to "#{i.code} #{i.summary}", category_item_path(i.category.name, i.code)

%h1
  = @similar_items_by_category[:title]
%ul
  - for cat in @similar_items_by_category[:items_by_category].keys
    %li
      = "#{cat.name}"
      %ul
        - for i in @similar_items_by_category[:items_by_category][cat]
          %li
            = link_to "#{i.code} #{i.summary}", category_item_path(i.category.name, i.code)

这是我的手机: (应用程序/细胞/ search_result_cell.rb)

class SearchResultCell < Cell::Rails

  def display options
    setup! options

    render
  end

  def setup! options

    #some code here that defines
    # category_items_title, like "Category Items"
    # array_of_found_items
    # similar_item_title, like "Similar Items"
    # hash_of_found_items_by_category
    #this code will be different for each search case in correspondent overridden function

    @category_items = { title: category_items_title, items: array_of_found_items }
    @similar_items_by_category = { title: similar_item_title, items_by_category: hash_of_found_items_by_category }
  end

end

我将为每个“搜索”案例分别设置单元类,从SearchResultCell派生它(也许我会将它重命名为GenericSearchResultCell),并覆盖设置!每个案例的函数......然后将使用构建器来定义要构建的类......

这是我的看法: (应用程序/视图/项目/ index.html.haml)

= render_cell :search_result, :display #, ... - and here some options...

现在问题

  1. 我应该在“设置”中进行真正的搜索请求吗?在一个细胞中的功能?然后让我的控制器ItemsController只是“解析”路由,并提供传递给我的SearchCell的选项......

  2. 或者我应该让我的ItemsController负责“解析”路由和发出搜索请求(定义array_of_found_items和hash_of_found_items_by_category)?然后将所有这些内容作为选项传递给SearchCell ......

  3. 所有这些“细胞实验”都值得吗?有没有更方便的方法来实现我的“搜索”视图和控制器?

2 个答案:

答案 0 :(得分:1)

考虑单元格gem的一个好方法是它提供一个控制器支持部分。换句话说,您的视图可以调用控制器,然后控制器将呈现部分控制器。当部分显示在许多视图中并且包含您不想在每个控制器中重复的重要数据处理时,这非常有用。

但是,它似乎不适合您的情况。您只提到一个将显示搜索结果的控制器ItemsController,因此可以在该控制器中完成所有数据处理。

您似乎还有两个视图,分类项目和类似项目。更好的方法可能是将它们定义为两个部分,然后在主视图中使用一些逻辑来确定要显示哪个或两个。

总之,当您希望视图循环返回并进行另一个控制器调用以处理数据并显示部分数据时,单元格非常棒,但在您的情况下,这似乎并不像您真正需要的那样。

答案 1 :(得分:1)

您应该将查询逻辑与控制器和渲染完全分离。引入一个类ItemsFinder,它执行所有搜索工作并返回结果集。

既然你有适当的模型集可以谈论你可以继续渲染。通常,当视图不是太复杂时(没有if-else,没有太多嵌套的部分),“旧”Rails部分方式就好了。

但是,通常你只想重写一小部分子子部分,这就是单元格视图继承的地方。它还鼓励你为你的“部分”定义接口,所以记住这一点

我同意Max的观点,当您在视图中拥有可重复使用的“小部件”时,单元格通常有助于保持控制器清洁。不要过度使用它,你; - )