Ruby ERB – 创建content_for方法

Ruby ERB – 创建content_for方法,第1张

概述我正在为一个gem工作一个ERB View类.有了这个类,我想为ERB模板提供一些帮助方法. 关于像h(string)这样的基本助手是没关系的.我发现 erbh gem帮助我了解更多上下文如何工作. 但是现在我正在尝试创建一个类似于Rails或Sinatra中的content_for方法. 我第一次使用简单的Proc来捕获视图块,然后只是调用call方法来打印它.它在开始时工作得很好. 但在完成视 我正在为一个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)enddef content_for?(key)  content_blocks[key.to_sym].any?enddef yIEld_content(key,default = nil)  return default if content_blocks[key.to_sym].empty?  content_blocks[key.to_sym].map { |b| capture(&b) }.joinenddef capture(&block)  @capture = nil  @_erbout,_buf_was = '',@_erbout  result = yIEld  @_erbout = _buf_was  result.strip.empty? && @capture ? @capture : resultenddef capture_later(&block)  proc { |*| @capture = capture(&block) }end
总结

以上是内存溢出为你收集整理的Ruby ERB – 创建content_for方法全部内容,希望文章能够帮你解决Ruby ERB – 创建content_for方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1265047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存