ruby-on-rails – 如何将arbre代码干燥成可重用的组件?
我有一个共同的模式或重复的代码,我想在我的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 运行上面的代码会导致此错误: 更新2将我的自定义组件代码移动到ActiveAdmin :: Views模块后,异常已更改为此. 我的关键问题似乎是我不能只调用我目前拥有super(属性)的yield(client).但这是一个arbre的东西所以我不知道该怎么做才能将客户端传递到调用块.这是正确的轨道还是有其他方法来干这个? 更新1 我已经意识到对super的调用可以在build方法的任何地方发生,并且与输出的内容无关.因此,即使我移动超级(属性)调用…我仍然无法弄清楚要放在面板块中的内容,以便我可以通过调用clients_breakdown来渲染其余的arbre组件. 解决方法
这是一个潜在的解决方案.
需要注意的一些事情是超级(属性)不应该被调用,除非 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 yield client end end end end end end end end end 另一种方法是定义辅助方法以提供相同的方法 module ClientsBreakdown def clients_breakdown(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 yield client end end end end end end end # config/initializers/active_admin.rb ActiveAdmin::Views::Pages::Base.include ClientsBreakdown (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |