Rails странная ошибка блока захвата - PullRequest
1 голос
/ 26 августа 2011

У меня есть вспомогательный метод 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 голосов
/ 26 августа 2011

Хорошо, так что я должен читать вещи. В рельсах 3 блока предполагается использовать следующую форму:

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

Также предполагается, что вспомогательные методы должны возвращать только строку, а не concat, поэтому я изменил свой вспомогательный метод следующим образом (с предложением от 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
...