1

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

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

我需要这个做什么?

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

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

例如,让类别为“动物”(此类别包含:数据库中的狗、猫和鸟项目)然后我应该在浏览器中看到:

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

例如让模式为“做”:

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

例如,让模式为“做”,类别为“动物”:

Category Items
    dog
Similar Items
    Cars
       dodge

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

这就是我想通过单元格显示的内容:(app/cells/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)

这是我的单元格:(app/cells/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 之类的名称),然后覆盖设置!每种情况的功能...然后将使用构建器来定义要构建的类...

这是我的观点:(app/views/items/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. 所有这些“细胞实验”值得吗?有没有更方便的方法来实现我的“搜索”视图和控制器?

4

2 回答 2

1

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

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

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

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

于 2012-10-07T16:10:34.337 回答
1

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

现在您有了合适的模型集可以讨论,您可以继续进行渲染。通常,当视图不太复杂(没有 if-else,没有太多嵌套的局部)时,“旧”Rails 局部方式就可以了。

但是,通常您只想覆盖子子子部分的一小部分,这就是单元格视图继承开始的地方。它还鼓励您为“部分”定义接口,因此请记住这一点。

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

于 2012-10-08T08:30:15.780 回答