如何让块的内容出现在视图中?

时间:2012-07-10 13:54:26

标签: ruby-on-rails ruby erb

我有一些像这样的代码:

<% 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" %>

我做错了什么?

3 个答案:

答案 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