Rails helper_method是否可以像在相应视图中调用yield一样使用yield?

问题描述 投票:0回答:1

我有以下手风琴发生器,当直接包含在视图中时,它可以正常工作:

<%
def collapser(name)
  fad = {
    class: 'collapsed',
    data: {toggle: 'collapse', parent: '#accordion_id'},
    href: "##{name}",
    aria: {expanded: 'true', controls: name}
  }
  tag.div(class: 'panel panel-default') do
    tag.div(class: 'panel-heading', role: 'tab') do
      tag.p(class: 'panel-title') do
        tag.a(fad) do
          tag.span do
            t("section.#{name}.title")
          end
        end
      end
    end +
    tag.div(id: name, class: 'panel-collapse collapse', role: 'tabpanel', style: 'height: 0px;', aria: {labelledby: name}, data: {parent: '#accordion_id'}) do
      tag.div(class: 'panel-body') do
        tag.div(class: 'uncode_text_column') do
          yield
        end
      end
    end
  end
end
%>

<%= tag.div(id: 'accordion_id', class: 'panel-group', role: 'tablist', aria: {multiselectable: 'true'}) do %>    
    <%= collapser('example') do %>
      <%= tag.p t('section.example.nub.row1') %>
    <% end %>
<% end %>

现在我想通过以下方式实现更干净的实现:

  • collapser移动到匹配的控制器
  • generic_collapser(name, parent)设为
    • 在代码库的其他部分中更广泛地访问
    • 此特定的折叠器可以实现为generic_collapeser(name, 'accordion_id')的调用>
  • 但是我坚持第一步,因为我无法正确处理上下文更改。首先,tag不再可用,但是简单地分配tag = view_context.tag似乎可以完成任务。但是,我没有找到转置yield语句的方法。我尝试了以下]]

    • 保持tag.div(class: 'uncode_text_column') { yield }
  • 使用tag.div(class: 'uncode_text_column') { view_contex{yield} }
  • tag.div(class: 'uncode_text_column') { view_contex(&block) }一起使用def collapser(name, &block)
  • 但是没有一个得到预期的结果。

    也将欢迎您寻求更好的资源来更好地了解view_contextyield和块管理,特别是带有练习的教程。

What's this &block in Ruby? And how does it get passed in a method here?

我有以下手风琴发生器,当直接包含在视图中时,它可以很好地工作:

ruby-on-rails helper yield ruby-block viewcontext
1个回答
0
投票

因此,此处要使用的关键功能是capture方法。这是解决问题所指定的方法:

<% # in the view %>
<% content[:section_1] = capture do %>
  <%= tag.ul do %>
    <%= tag.li item 1 %>
    <%= tag.li item 2 %>
    <%= tag.li item 3 %>
  <% end %>
<% end %>

<% content[:section_2] = capture do %>
  <%= tag.p 'some paragraphe %>
<% end %>

<% bib = "accordion_#{SecureRandom.hex}" %>
<% title = ->(name){t("section.#{name}.title")} %>
<%= tag.div(id: bib, class: 'panel-group', role: 'tablist', aria: {multiselectable: 'true'}) do %>
  <% content.each do |key, nub| %>
    <%= collapser(key, title[key], nub, bib) %>
  <% end %>
<% end %>
© www.soinside.com 2019 - 2024. All rights reserved.