2011-08-26 10 views
1

항복 섹션의 기본 내용을 제공하는 데 사용할 수있는 도우미 메서드 'default_content_for'가 있습니다. 그러나 내가 그것을 사용할 때, 나는 도우미로부터 이상한 출력을 얻는다.레일스 이상한 캡처 블록 오류

나는 아마 내가 무언가를 놓치고있는 것이 확실하지만, 무엇이 잘못되었는지 확신 할 수 없다.

제목이 블록 시작 부분 위에 가득 찼습니다. 그래서 같이 :

<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)은 네임 심볼을 평가하여 메소드가 참조하는 곳입니다. 또한, 특히 중첩 된 테 네리 택은 시간이 지남에 따라 읽기가 까다로울 수 있습니다. 적절한 if 문을 사용하여보다 장기적인 사용이 가능합니다. 또는 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