【问题标题】:Implement Rails Helpers Effectively Taking Multiple Blocks实现 Rails Helpers 有效地获取多个块
【发布时间】:2021-06-12 20:13:20
【问题描述】:

所以我希望能够编写一个 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 的过程/块以及用于第二内容的 proc/block?

<%= 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 并将这些内容保存到标识符中,但如果我想以嵌套方式使用帮助器,这似乎会导致名称冲突)。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-6.1


    【解决方案1】:

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

    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 %>
    

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

    【讨论】:

    • 是的,但是 top_context 构建器需要获取两个参数,以便它可以例如交错第一个和第二个内容的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多