2011-08-26 51 views
1

我有一個輔助方法'default_content_for',可以用來爲yield部分提供默認內容。然而,當我使用它時,我從助手那裏得到了奇怪的輸出。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> 

helper方法

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)在哪裏,因爲你的方法是通過評估名稱符號來引用它的,而且我發現嵌套的terinary非常難以閱讀,尤其是隨着時間的推移。正確的如果陳述更好的長期使用。或者如果你不需要out = false,那麼只需要:'out || = capture(&block)' – agmcleod

+0

修復了我的幫手方法,看到我的答案。 – joekarl

回答

0

好了,所以我應該讀的東西。 在軌道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 
+0

我實際上認爲可能是這樣,但我不確定,因爲我以前從未真正使用/看過Concat。它輸出的東西在那裏讓我懷疑。 – agmcleod