2010-12-20 2 views
4

다른 헬퍼와 뷰에서 사용할 수있는 자바 스크립트를 인쇄 할 때 도우미를 작성하면 다음과 같은 문제가 발생했습니다.신비한 Ruby 차단 동작 : & block vs. {block.call}

def javascript(print_tag = false, &block) 
    content_for(:javascript) do 
    if print_tag 
     javascript_tag(&block)   # does not work 
     javascript_tag { block.call } # does work 
    else 
     capture(&block) 
    end 
    end 
end 

이 도우미는 javascript { "alert('hurray'); }와 함께 호출되어야합니다.

첫 번째 대안 - 내가 기대했던 - Rails javascript_tag helper은 빈 <script type="text/javascript"> //<![CDATA[ //]]> </script> 태그를 렌더링합니다.

그러나 두 번째 대안은 예상대로 작동합니다.

무슨 일 이니? 어떻게 다를 수 있습니까?

답변

4

당신은 당신의 견해에서 이것을한다고 말하는 것입니까?

<% javascript do %> 
    alert('hurray'); 
<% end %> 

content_tag의 행동이 그것에서 불리는 위치에 따라 다릅니다

<%= javascript { "alert('hurray');" } %> 

그러나 대한 content_tag(&block) 당신이 content_tag이보기에 사용하기위한 것입니다 방법, javascript를 호출해야 작동합니다 소스 코드에서 block_called_from_erb? 함수를 참조하십시오. 첫 번째 경우에이 함수는 true을 반환합니다. 그 이유는 블록이 erb에서 온 것이기 때문입니다 (두 번째 블록은 처음부터 블록을 다시 작성한 것입니다). content_tag 원하는 내용의 문자열 내용을 반환합니다.

# ./action_view/helpers/javascript_helper.rb 
tag = content_tag(:script, javascript_cdata_section(content), html_options.merge(:type => Mime::JS)) 
if block_called_from_erb?(block) 
    concat(tag) 
else 
    tag 
end 
+0

오 ... 무슨 까다로운 구현! 사실 나는 Haml :'javascript (true) {fire_flash} if flash_message.present?'를 사용하고 있으며, 1 줄에 괜찮 으면 4 줄로 작성하고 싶지 않습니다. 그러나, 대단히 감사합니다! – crispy