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

看起来do您的辅助方法中的块没有返回任何内容,因此整个辅助方法没有返回任何内容,因此视图不再显示任何内容。

也许试试这个:

def cached_snippet_content(snip_id)
  cache(snip_id) do
    result = cms_snippet_content(snip_id)
  end
  result
end
于 2012-07-10T14:01:36.323 回答
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 回答