2011-08-26 5 views
1

私は降伏セクションのデフォルトのコンテンツを提供するために使用できるヘルパーメソッド 'default_content_for'を持っています。しかし、私はそれを使用しているとき、私はヘルパーから奇妙な出力を取得します。Railsの奇妙なキャプチャブロックエラー

私はおそらく何かが間違っていると確信していますが、何が間違っているのかまだ分かりません。

タイトルは、ブロックの先頭より上のものでいっぱいになります。これと同じように:

<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> 
+0

あなたが呼んでいるcontent_for(:title)は、あなたのメソッドが名前シンボルを評価することによってそれを参照するので、どこにありますか?また、ネストされたテラリカルは、特に時間が経つにつれて読みにくいことがわかります。あなたがout = falseを必要としない場合は、次のようにしてください: 'out || = capture(&block)' – agmcleod

+0

私のヘルパーメソッドを修正しました。私の答えを見てください。 – joekarl

答えて

0

わかりましたので、私は物事を読んでください。 3つのブロックは次の形式を使用することになっているレールに :

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

また、ヘルパーメソッドは、文字列だけではない連結を返すことになっているので、私は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 
+0

私は実際にそうかもしれないと思っていましたが、私が実際に使用したことはない/私が以前にConcatを見たことは確かではありませんでした。何かを出力していたという事実は私にそこに疑いを与えました。 – agmcleod