[英]Implement Rails Helpers Effectively Taking Multiple Blocks
因此,我希望能够编写一个 Rails 助手,它可以将视图的块作为 arguments (很确定这是不可能的),或者更改块内助手的操作方式。 理想情况下(但我很确定这是不可能的),我可以执行类似以下的操作,其中 top_context_builder 然后使用对应于 firstcontent 和 secondcontent 的 proc/block arguments 执行(例如,也许我想将它们交错在 output 作为 firstcontent secondcontent secondcontent firstcontent)
<%= top_context builder: foo_builder, argone: %>
firstcontent
<% argtwo: %>
secondcontent
<% end %>
但似乎更合理的是,也许我可以将上下文注入我正在执行的块中。 那么有什么方法可以让 top_context 将参数提供给帮助器 get_first_context 和 get_second_context 然后 get_first_context 将它的块参数存储在 top_context 设置的某个位置,这样 get_second_context 就可以访问生成器 arg,一个用于 firstcontent 的过程/块和第二内容的过程/块?
<%= top_context builder: foo_builder do %>
<%= get_first_context do %>
firstcontent
<% end %>
<%= get_second_context do %>
secondcontent
<% end %>
<% end %>
问题是如何在不污染全局变量的情况下将构建器 arg 和 firstcontent 设置为 get_second_context (例如,我可以以嵌套方式使用它)。 我可能很愚蠢,但会很感激任何想法。
(是的,我想我可以使用 content_for 并将这些东西保存到标识符中,但如果我想以嵌套方式使用帮助器,这似乎会导致名称冲突)。
我认为您正在寻找的只是阻止 arguments。 使用yield
时,您可以将任意数量的 arguments 生成到块中:
def foo(&block)
yield "Hello", "World"
end
foo { |*args| puts args.join(" ") }
这就是 Rails 处理form_for/form_with
和fields_for
的方式。 这些方法只是产生一个表单构建器实例,您在该实例上调用方法,而不是在渲染上下文中胡闹。
<%= form_with(model: @book) do |form| %>
<%= form.fields_for(:author) do |author| %>
<%= author.label :name %>
<%= author.text_field :name %>
<% end %>
<% end %>
因此,在您的示例中,它看起来像:
<%= top_context builder: foo_builder do |ctx| %>
<%= ctx.get_first_context do |local_ctx| %>
<%= local_ctx.firstcontent %>
<% end %>
<%= ctx.get_second_context do |local_ctx| %>
<%= local_ctx.secondcontent %>
<% end %>
<% end %>
这确实需要从一个简单的辅助方法进行一些重构,但如果您需要这种复杂性,则已经需要单独的 object。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.