Rails奇怪的捕获块错误

时间:2011-08-26 18:52:26

标签: ruby-on-rails capture block

我有一个帮助方法'default_content_for',可用于为yield部分提供默认内容。但是当我使用它时,我从帮助器得到了奇怪的输出。

我很确定我可能会遗漏一些简单的东西,但仍然不确定是什么问题。

标题最终在块的开头上方充满了东西。像这样:

<title>   Default Title&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt;      &lt;title&gt;   Default Title   </title>

application.html.erb

<!DOCTYPE html>
<html>
<head>

  <title>
  <% default_content_for :title do %>
    Default Title
  <% end %>
  </title>

  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>


<%= yield %>

</body>
</html>

<!DOCTYPE html>
<html>
<head>

  <title>
  <% default_content_for :title do %>
    Default Title
  <% end %>
  </title>

  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>


<%= yield %>

</body>
</html>

帮助方法

module ApplicationHelper
    def default_content_for(name, &block)
      name = name.kind_of?(Symbol) ? ":#{name}" : name
      out = eval("yield #{name}", block.binding)
      out = (out ? (out.empty? ? false : out): false) || capture(&block)
      concat(out)
    end
end

输出

<!DOCTYPE html>
<html><head>

  <title>   Default Title&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt;      &lt;title&gt;   Survey Builder   </title>


  <script type="text/javascript" src="/javascripts/prototype.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/effects.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/dragdrop.js?1314309078"></script>
<script type="text/javascript" src="/javascripts/controls.js?1314309078"></script>
<script type="text/javascript" src="/javascripts/rails.js?1314309079"></script>
<script type="text/javascript" src="/javascripts/application.js?1314309078"></script>
  <meta content="authenticity_token" name="csrf-param">
<meta content="oG4mVUt5wy6aWdhbxmXa3tYh3DUgXVUQy9d6uxng6a0=" name="csrf-token">
</head>
<body>

<div id="user_nav">
        Logged in as KARL KIRCH
        <a href="/log_out">Log out</a>
</div>


<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>




</body></html>

1 个答案:

答案 0 :(得分:0)

好的,我应该读一些东西。 在rails中,3个块应该使用以下形式:

<%= default_content_for :title do %>
<% end %>

另外helper方法应该只返回一个字符串而不是concat,所以我改变了我的helper方法(来自agmcleod的建议

  module ApplicationHelper
    def default_content_for(name, &block)
      name = name.kind_of?(Symbol) ? ":#{name}" : name
      out = eval("yield #{name}", block.binding)
      if out && !out.empty?
        out
      else
        capture(&block)
      end
    end
  end