gpt4 book ai didi

ruby-on-rails - 如何从 Ruby block 中的多个语句生成结果?

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:32 24 4
gpt4 key购买 nike

我有一对 Rails 助手,其中一个用于接受 block ,另一个只呈现一个按钮。以下是帮助程序定义的简化版本:

def nav_wrapper(nav_at, id, css_class, &block)
"<ul class="complicated">\n #{yield} \n</ul>".html_safe
end

def nav_btn(nav_at, caption, id = caption.downcase.dasherize)
"Nav button codes goes here".html_safe
end

我正在尝试设置这样我可以做这样的事情:

<%= nav_wrapper(@nav_at, "Top Nav", "class") do %>
<%= nav_btn(@nav_at, "Foo", "id") %>
<%= nav_btn(@nav_at, "Bar", "id") %>
<%= nav_wrapper(@nav_at, "Sub Nav", "class") do %>
<%= nav_btn(@nav_at, "SubFoo", "id") %>
<%= nav_btn(@nav_at, "SubBar", "id") %>
<% end %>
<% end %>

但是,nav_wrapper 方法中的yield 只选取每个 block 的最后一条语句。所以在这个例子中,我得到了 Top Nav 包装器,跳过了 Foo 和 Bar,我得到了 Sub Nav 包装器(作为外部 nav_wrapper block 中的最后一条语句),跳过了 SubFoo,我得到了SubBar(是内部 nav_wrapper block 中的最后一条语句)。

我知道这种行为的原因是代码块隐式返回了最后评估的值,但我知道有很多模板助手可以呈现所有间隙行(form_for,例如)。有人可以帮我弄清楚这里的魔术是什么吗?

最佳答案

编译 ERB 模板时,它会转换为将字符串添加到缓冲区的代码。 (查看 ERB 的源代码以了解我的意思。)操作 View 中的方法,如 form_for 执行 block ,然后检索 ERB 缓冲区中的文本。

打开 lib/ruby/1.9.1/gems/1.9.1 文件夹,寻找 actionpack。打开您拥有的任何版本的 Action Pack,然后转到 lib/action_view/helpers/capture_helper.rb。那里有一个名为capture的方法,form_for使用它来执行一个 block 并检索ERB生成的文本。

如果您正在编写 Rails 帮助器,那么您的代码大概可以使用 capture。如果没有,请尝试 include ActionView::Helpers::CaptureHelper

关于ruby-on-rails - 如何从 Ruby block 中的多个语句生成结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8993173/

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