我有一些像这样的代码:
<% 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" %>
我做错了什么?
答案 0 :(得分: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样式(&lt;%= ...&gt;即使在块中输出内容也是如此):
<%= cache "key" do %>
<%= content_tag(:p, "hello") %>
<% end %>
我会仔细测试,可能会有隐藏的角落,我想有一个原因cache
没有适应Rails 3块样式。
答案 1 :(得分:0)
看起来你的helper方法中的do
块没有返回任何东西,因此整个helper方法没有返回任何东西,从此以后没有任何东西可供显示。
也许试试这个:
def cached_snippet_content(snip_id)
cache(snip_id) do
result = cms_snippet_content(snip_id)
end
result
end
答案 2 :(得分:0)
试试这个:
def cached_snippet_content(snip_id)
a = ""
cache(snip_id) do
a += cms_snippet_content(snip_id).to_s
end
a
end