我有以下手风琴生成器,当直接包含在视图中时可以正常工作:
<%
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_context
和yield
块管理也将受到欢迎,尤其是带有练习的教程。