0

所以我希望能够编写一个 Rails 助手,它可以将视图的块作为参数(很确定这是不可能的),或者改变块内助手的操作方式。理想情况下(但我很确定这是不可能的),我可以执行以下操作,其中 top_context_builder 然后使用对应于 firstcontent 和 secondcontent 的 proc/block 参数执行(例如,也许我想在输出中将它们交错为 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 并将这些东西保存到标识符中,但如果我想以嵌套方式使用帮助器,这似乎会导致名称冲突)。

4

1 回答 1

0

我认为您正在寻找的只是块参数。使用时,yield您可以为块产生任意数量的参数:

def foo(&block)
  yield "Hello", "World"
end

foo { |*args| puts args.join(" ") }

这就是 Railsform_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 %>

这确实需要对一个简单的辅助方法进行一些重构,但是如果您需要这种复杂性,则已经需要一个单独的对象。

于 2021-06-13T15:40:50.733 回答