加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 神秘的Ruby Block行为:&block vs. {block

发布时间:2020-12-17 02:28:04 所属栏目:百科 来源:网络整理
导读:当编写一个帮助打印可以从其他助手和视图中使用的 javascript时,我偶然发现了以下问题: def javascript(print_tag = false,block) content_for(:javascript) do if print_tag javascript_tag(block) # does not work javascript_tag { block.call } # does
当编写一个帮助打印可以从其他助手和视图中使用的 javascript时,我偶然发现了以下问题:

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 [//]]> < /脚本>标签.

然而,第二种选择按预期工作.

那里发生了什么?怎么会有所不同?

解决方法

你说你在观点上这样做,对吗?

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

但是要使content_tag(& block)起作用,你应该以在视图中使用content_tag的方式调用javascript,这是:

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

content_tag的行为根据调用的位置而有所不同,请参阅函数block_called_from_erb?在源代码中.在第一种情况下,这个函数返回true,因为块确实来自erb(然后它是conced,你不需要!),在第二个返回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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读