Ruby on rails Ruby on Rails,从select_标记中排除值(作为嵌套集)

Ruby on rails Ruby on Rails,从select_标记中排除值(作为嵌套集),ruby-on-rails,ruby,rubygems,Ruby On Rails,Ruby,Rubygems,我有一个select标签,它也使用Select2以下拉方式显示一些类别 <%= category.select :parent_id, nested_set_options(Category, @category) {|i| if !(i.depth >= 2) "#{i.root.name if !i.parent_id

我有一个select标签,它也使用Select2以下拉方式显示一些类别

<%= category.select :parent_id, nested_set_options(Category, @category) {|i| if !(i.depth >= 2)
                                                                                  "#{i.root.name if !i.parent_id.nil? } #{'>' unless !i.parent_id}  #{i.name}"

                                                                               end
                                                                                 } , {include_blank:true}  , class: 'select2 form-control'%>

需要一点想象力,但这是可以做到的

首先,select帮助程序几乎只需要一个数组,因此类似于:

[ ["Apples", 1], ["Oranges", 2], ["Bananas", 3] ]
最后,如果
nested\u set\u options
返回了什么。因此,最终,您可以操作
嵌套的\u set\u选项
返回的数组数组,以满足您的需要。示例(为清晰起见添加了空格和缩进):

=2)
“#{i.root.name if!i.parent_id.nil?}{{>'除非!i.parent_id}{i.name}”
结束
}.如果{i}拒绝{u}
i[0].nil?| i[0].strip.blank?
}, 
{include_blank:true},
类:“选择2表单控件”%>
这里的关键是检查数组的数组,看看显示文本(每个数组的第一个元素)是否为空。因为您实际上是将
作为字符串返回,所以此检查会删除空格,然后查看结果字符串是否为空。如果是,它将删除该元素。最后一个数组将只包含其显示包含一些非空字符的元素

您甚至可以进一步扩展,添加管理用户检查,并在用户是管理员的情况下拒绝某些选项

或者,您也可以考虑覆盖
类别
移动方法。然而,我认为您的业务逻辑太复杂,无法走这条路,可能会在您的模型中引入一些反模式。但是,这是一种选择,也将完成任务


希望有帮助

嘿@GoGoCarl,缩进方面做得很好,我的美容师快要死了:D:D,我肯定要做一些挖掘才能完全理解这个问题,我也尝试过使用.reject选项,但不知道数组背景。看起来真的很合法,现在非常感谢你,我很快就会回来:)
[ ["Apples", 1], ["Oranges", 2], ["Bananas", 3] ]
<%= category.select :parent_id, 
      nested_set_options(Category, @category) { |i| 
        if !(i.depth >= 2)
          "#{i.root.name if !i.parent_id.nil? } #{'>' unless !i.parent_id}  #{i.name}"
        end
      }.reject_if { |i| 
        i[0].nil? || i[0].strip.blank? 
      }, 
      {include_blank:true}, 
      class: 'select2 form-control'%>