gpt4 book ai didi

Ruby ERB - 创建一个 content_for 方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:57 25 4
gpt4 key购买 nike

我目前正在为 gem 开发 ERB View 类。对于这个类,我想为 ERB 模板提供一些辅助方法。
h(string) 这样的基本助手没问题。我找到了 erbh gem谁帮助我更多地了解上下文的工作原理。
但现在我正在尝试创建一个 content_for 方法,就像在 Rails 或 Sinatra 中一样。

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

我对 ERB 的了解还不足以了解 ERB 缓冲的工作原理。

代码

这里是解释我的代码状态的要点。我从我的库中提取了代码并对其进行了一些简化。

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

我想要什么?

我只是想让 content_for 方法像在 Rails 和 Sinatra 中那样工作。

谢谢!

最佳答案

看完这篇blog article我终于找到了为什么它不起作用。我不知道我是否以最佳方式和更简洁的方式完成了它,但它确实有效。

所以这个bug主要来自ERB初始化。通过使用属性而不是局部变量作为 eoutvar现在可以使用了。

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

我还稍微更改了 content_for 助手使用的 capture 方法。

现在看起来像这样 ( 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

关于Ruby ERB - 创建一个 content_for 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39059616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com