1

これがセル定義内でモデル要求を行うための良いアプローチであるかどうか疑問に思っています....?

また、OOP の観点から、さまざまなコンテキストで検索結果のさまざまな表現を実装するためのより便利な方法を一般的に定義する必要もあります。

これは何のために必要ですか?

アイテムのカテゴリがあります。検索結果をセルとして実装したい。検索結果は、次の 3 つのケースに応じて少し異なる方法で表示する必要があります。

  • 指定したカテゴリのすべてのアイテムを検索

たとえば、カテゴリを「動物」(このカテゴリには、データベース内の犬、猫、鳥の項目が含まれます) とすると、ブラウザに次のように表示されます。

 Category Items
    dog
    cat
    bird
  • 指定した「柄」に似た商品を全カテゴリから探す

たとえば、パターンを「do」にします。

Similar Items
   Animals
      dog
   Cars
      dodge
  • 指定された「カテゴリ」内の指定された「パターン」に類似するアイテムを検索します

たとえば、パターンを「do」、カテゴリを「animals」にします。

Category Items
    dog
Similar Items
    Cars
       dodge

これを実装するために、cells gem を試してみることにしました...

これは、セル経由で表示したいものです: (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. 「set!」内で実際の検索リクエストを行う必要があります。細胞内で機能しますか?そして、コントローラーの ItemsController をルートを「解析」し、そのオプションを SearchCell に渡すようにします...

  2. または、ItemsController がルートの「解析」と検索リクエストの作成 (array_of_found_items と hash_of_found_items_by_category を単独で定義) の両方を担当するようにする必要がありますか? そして、このすべてのものをオプションとして SearchCell に渡すだけです...

  3. このすべての「細胞実験」は価値がありますか? 「検索」ビューとコントローラーを実装するより便利な方法はありますか?

4

2 に答える 2

1

コントローラーとレンダリングからクエリ ロジックを完全に分離する必要があります。ItemsFinderすべての検索を行い、結果セットを返すクラスを導入します。

適切なモデル セットが用意できたので、レンダリングに進むことができます。通常、ビューが複雑すぎない場合 (if-else がなく、ネストされたパーシャルが多すぎない場合)、「古い」Rails パーシャルの方法で問題ありません。

ただし、サブサブサブパーシャルのほんの一部をオーバーライドしたいことがよくあり、そこでセルのビューの継承が開始されます。また、「パーシャル」のインターフェイスを定義することも推奨されるため、覚えておいてください。

ビューに再利用可能な「ウィジェット」がある場合、セルは通常、コントローラーをきれいに保つのに役立つというマックスに同意します。使いすぎないでください;-)

于 2012-10-08T08:30:15.780 に答える
1

セルジェムについて考える良い方法は、それがコントローラーに裏打ちされたパーシャルを提供するということです。つまり、ビューは、パーシャルをレンダリングするコントローラーを呼び出すことができます。これは、パーシャルが多くのビューで表示され、各コントローラーで繰り返したくない重要なデータ処理が含まれている場合に最適です。

ただし、これはあなたのケースには当てはまらないようです。検索結果を表示する1つのコントローラー、ItemsControllerのみについて言及しているため、すべてのデータ処理はそのコントローラーで実行できます。

また、カテゴリ アイテムと類似アイテムの 2 つのビューがあるようです。より良いアプローチは、これらを 2 つのパーシャルとして定義し、メイン ビューで何らかのロジックを使用して、どちらまたは両方を表示するかを決定することです。

要約すると、セルは、ビューをループバックして別のコントローラー呼び出しを行い、データを処理してパーシャルを表示する場合に最適ですが、あなたの場合、これは本当に必要なものとは思えません。

于 2012-10-07T16:10:34.337 に答える