- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一对 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/
我是一名优秀的程序员,十分优秀!