2010-12-20 15 views
4

当编写打印的JavaScript,可以从两个其他帮助,并享有使用一个帮手,我偶然发现了以下问题:神秘红宝石座行为:块与{} 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 { "alert('hurray');" } %> 

content_tag(&block)工作,你应该叫javascript方式content_tag意在视图中使用,这就是:不同的地方它是从所谓的

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

content_tag的行为是不同的,请参阅源代码中的功能block_called_from_erb?。在第一种情况下,该函数返回true,因为该块确实来自erb(然后它是concat ed,您不需要这么做!),第二次返回false(您重新创建了该块)和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 2010-12-20 15:57:04