Ruby ERB – 创建content_for方法
我正在为一个gem工作一个ERB View类.有了这个类,我想为ERB模板提供一些帮助方法.
关于像h(string)这样的基本助手是没关系的.我发现 erbh gem帮助我了解更多上下文如何工作.
但是现在我正在尝试创建一个类似于Rails或Sinatra中的content_for方法. 我第一次使用简单的Proc来捕获视图块,然后只是调用call方法来打印它.它在开始时工作得很好. 我对ERB的了解不足以了解ERB缓冲是如何工作的. 码 这是一个解释我的代码状态的要点.我从我的库中提取代码并简化了一下. https://gist.github.com/nicolas-brousse/ac7f5454a1a45bae30c52dae826d587f/66cf76c97c35a02fc6bf4a3bc13d8d3b587356de 我想要什么? 我只想让content_for方法像Rails和Sinatra一样工作. 谢谢! 解决方法
看完这个
blog article之后,我终于找到了为什么它不起作用.我不知道我是以最好的方式和更清洁的方式做到的,但它确实有效.
所以这个错误主要来自ERB的启动.通过使用属性而不是局部变量作为 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |