1

次のようなコードがあります。

<% cache "footer_links" do %>
  <%= cms_snippet_content('footer_links') %>
<% end %>

そして、次のようなヘルパー メソッドを作成することを考えました。

def cached_snippet_content(snip_id)
  cache(snip_id) do
    cms_snippet_content(snip_id)
  end
end

ただし、私のerbコードは次のようになっていますが、ビューには何も出力されません。

<%= cached_snippet_content "footer_links" %>

私は何を間違っていますか?

4

3 に答える 3

1

ソースがあなたと共にありますように、ルーク:

# actionpack-3.2.0/lib/action_view/helpers/cache_helper.rb
def cache(name = {}, options = nil, &block)
  if controller.perform_caching
    safe_concat(fragment_for(name, options, &block))
  else
    yield
  end

  nil
end

これは、cacheがヘルパーからではなく、ERB ビューから呼び出されるように実装されていることを示しています。別の実装:

def cache(name = {}, options = nil, &block)
  if controller.perform_caching
    fragment_for(name, options, &block)
  else
    capture(&block)
  end
end

そして今、それを新しい Rails ERB スタイルで使用します (<%= ... > 何かを出力する場合はブロック内でも):

<%= cache "key" do %>
  <%= content_tag(:p, "hello") %>
<% end %>

cacheこれを慎重にテストしたところ、隠れたコーナーがあるかもしれません。Rails 3 のブロック スタイルに適応されていないのには理由があると思います。

于 2012-07-10T14:39:19.463 に答える
0

これを試して:

def cached_snippet_content(snip_id)
  a = ""
  cache(snip_id) do
    a += cms_snippet_content(snip_id).to_s
  end
  a
end
于 2012-07-10T14:38:37.373 に答える