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

Ruby ERB – 创建content_for方法

发布时间:2020-12-17 01:56:52 所属栏目:百科 来源:网络整理
导读:我正在为一个gem工作一个ERB View类.有了这个类,我想为ERB模板提供一些帮助方法. 关于像h(string)这样的基本助手是没关系的.我发现 erbh gem帮助我了解更多上下文如何工作. 但是现在我正在尝试创建一个类似于Rails或Sinatra中的content_for方法. 我第一次使
我正在为一个gem工作一个ERB View类.有了这个类,我想为ERB模板提供一些帮助方法.
关于像h(string)这样的基本助手是没关系的.我发现 erbh gem帮助我了解更多上下文如何工作.
但是现在我正在尝试创建一个类似于Rails或Sinatra中的content_for方法.

我第一次使用简单的Proc来捕获视图块,然后只是调用call方法来打印它.它在开始时工作得很好.
但在完成视图后我看到有线认为,有些内容被多次打印.
所以我看看Sinatra ContentFor helper,了解他们是如何做到的,我复制了这个助手的一些方法.我没有错误,但块返回总是空的……我真的不知道为什么.

我对ERB的了解不足以了解ERB缓冲是如何工作的.

这是一个解释我的代码状态的要点.我从我的库中提取代码并简化了一下.

https://gist.github.com/nicolas-brousse/ac7f5454a1a45bae30c52dae826d587f/66cf76c97c35a02fc6bf4a3bc13d8d3b587356de

我想要什么?

我只想让content_for方法像Rails和Sinatra一样工作.

谢谢!

解决方法

看完这个 blog article之后,我终于找到了为什么它不起作用.我不知道我是以最好的方式和更清洁的方式做到的,但它确实有效.

所以这个错误主要来自ERB的启动.通过使用属性而不是局部变量作为eoutvar,它现在可以工作.

erb = ERB.new(str,nil,"<>","@_erbout")

我还改变了content_for helper使用的捕获方法.

它现在看起来像这样(gist)

def content_for(key,content = nil,&block)
  block ||= proc { |*| content }
  content_blocks[key.to_sym] << capture_later(&block)
end

def content_for?(key)
  content_blocks[key.to_sym].any?
end

def yield_content(key,default = nil)
  return default if content_blocks[key.to_sym].empty?
  content_blocks[key.to_sym].map { |b| capture(&b) }.join
end

def capture(&block)
  @capture = nil
  @_erbout,_buf_was = '',@_erbout
  result = yield
  @_erbout = _buf_was
  result.strip.empty? && @capture ? @capture : result
end

def capture_later(&block)
  proc { |*| @capture = capture(&block) }
end

(编辑:李大同)

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

    推荐文章
      热点阅读