2

「Statistics」または「Friends」と呼ばれる 300X300px のブロックがあるとします。このブロックには、いくつかのデータベース オブジェクトと論理操作が必要であり、従来はコントローラー内に配置する必要があり、ビュー/部分に適切に表示されるいくつかのインスタンス変数を準備します。

このブロックは、さまざまなコントローラーとアクションを横断して、私の Web サイトの多くのページから呼び出すことができます。

コントローラー内でコードを繰り返したり、ビュー内にロジックを配置したりせずに、この問題に対処するにはどうすればよいですか。

悪い解決策は、ビュー内に SQL クエリを配置するか、単一のコントローラー/アクションが期待される HTML を生成する iframe を使用することです。

どんなアイデアでも大歓迎です。

4

3 に答える 3

3

これは、ヘルパーメソッドで行うべきことだと思います。localsビューの名前空間を汚染しないように、インスタンス変数の代わりにパーシャルを使用することをお勧めします。

module ApplicatonHelper

  def friends_block
    friends = Friend.where(...)
    # Assuming the 'friends_block' partial is in a directory 'app/views/shared'
    render :partial => "shared/friends_block", :locals => {:friends => friends}  
  end

end

friends_blockパーシャルはローカル変数を使用します。

<div id="friends_block">
  <% friends.each do |s| %>
    ...
  <% end %>
</div>

また、他のビューはヘルパー メソッドを使用するだけで、他のことを気にする必要はありません。

<%= friends_block %>
于 2012-04-20T12:11:02.903 に答える
2

Cells gem をご覧ください: https://github.com/apotonick/cells

于 2012-04-20T11:50:15.030 に答える
1

ブロックをパーシャルに入れ、そのブロックに必要なインスタンス変数がbefore_filter関連するコントローラーとアクションにロードされるようにします。

于 2012-04-20T11:17:28.270 に答える