关于像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方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)