Ruby on Rails,从select_tag中排除值(acts_as_nested_set)

时间:2017-05-25 17:48:28

标签: ruby-on-rails ruby rubygems

我有一个选择标记,它使用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'%>

如果您决定将其嵌套在父级下,则此选择是创建新类别时的提示。

我使用此代码的原因是因为我只想让管理员选择嵌套到depth=3,所以只有Parent -> Kid -> GrandKid

代码效果很好,但是当决定不显示某个值时,我会得到一个空格(这个空间要小得多),但用户仍然可以选择它。

有什么方法可以排除那些超出这个条件的值吗?

enter image description here

解决这个问题的代码是对GoGoCarl的好答案的解释,只是因为reject_if

我遇到了一个小问题

所以我只是把整个事情转过来并最终得到了这个:

<%= 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
 }.select { |i|
    !i[0].nil? || !i[0].blank?
  } , {include_blank:true , include_hidden:false}  , class: 'select2 form-control'%>

1 个答案:

答案 0 :(得分:1)

需要有点花哨,但可以做到。

首先,select helper几乎只需要一个Array of Arrays,所以类似于:

[ ["Apples", 1], ["Oranges", 2], ["Bananas", 3] ]

最后,如果nested_set_options正在返回。因此,最终,您可以操纵nested_set_options返回的阵列数组以满足您的需求。示例(为清晰起见,添加了空格和缩进):

<%= 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'%>

这里的关键是检查数组,以查看显示文本(每个数组的第一个元素)是否为空白。因为您实际上将" "作为字符串返回,所以此检查会删除空格,然后查看结果字符串是否为空。如果是这样,它将删除该元素。最终的Array只包含那些显示包含一些非空白字符的元素。

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

或者,您也可以考虑覆盖move_possible?的{​​{1}}方法。但是,我认为您的业务逻辑太复杂,无法走这条路线,可能会在您的模型中引入一些反模式。但是,这是一个选项,也可以完成任务。

希望有所帮助!