繁体   English   中英

实现 Rails Helpers 有效地获取多个块

[英]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_withfields_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM