我有一个共同的模式或重复的代码,我想在我的 ActiveAdmin 视图中干掉它们。我正在使用arbre组件尽可能多地呈现我的视图,如果可能的话,我想保持这种方式(即我真的不想以正常方式转换为直接的 HTML ——我'我试图理解这里的arbre方式)。这是我想干掉的代码:
clients.in_groups_of(3).each do |clients_group|
columns do
clients_group.compact.each do |client|
column do
panel client.name do
# ...
end
end
end
end
end
在阅读了 arbre gem 中的文档后,我开始尝试创建自己的自定义 arbre 组件。但我很快就被迫意识到我不知道如何满足 arbre。我不知道如何将我的局部变量传递到块中。例如:
# config/initializers/active_admin.rb
module ActiveAdmin
module Views
class ClientsBreakdown < ActiveAdmin::Component
builder_method :clients_breakdown
def build(clients, attributes = {})
group_size = attributes.delete(:in_groups_of) { 3 }
clients.in_groups_of(group_size).each do |clients_group|
columns do
clients_group.compact.each do |client|
column do
panel client.name do
super(attributes) # Doesn't seem to matter where this `super` call
# is, but I do want to be able to pass `client`
# into the `clients_breakdown` block here
# yield(client) # -- I've also tried adding this.
end
end
end
end
end
end
end
end
end
然后,在我的 ActiveAdmin 用户视图中调用它可能如下所示:
clients_breakdown(Client.all, in_groups_of: 2) do |client|
ul do
li client.name
end
end
运行上面的代码会导致这个错误:
更新 2ActiveAdmin::Views
将我的自定义组件代码移动到模块后,异常已更改为此。
我的关键问题似乎是我不能只打电话给yield(client)
我目前拥有的地方super(attributes)
。但这是一件很随意的事情,所以我不知道该怎么做才能将客户端传递到调用块。这是正确的轨道还是有另一种方法来干燥它?
更新 1
我已经意识到调用super
可以发生在build
方法中的任何地方,并且与输出的内容无关。因此,即使我将super(attributes)
调用向上移动......我仍然无法弄清楚要在panel
块内放置什么,以便我可以将其余的 arbre 组件从调用中渲染到clients_breakdown
.