【问题标题】:Ruby on Rails , exclude values from select_tag (acts_as_nested_set)Ruby on Rails,从 select_tag (acts_as_nested_set) 中排除值
【发布时间】:2017-05-26 05:50:21
【问题描述】:

我有一个选择标签,它也使用 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 -&gt; Kid -&gt; GrandKid

代码运行良好,但是当决定不显示某个值时,我得到一个空白(要小得多),但用户仍然可以选择它。

有什么办法可以排除那些不属于这种情况的值吗?


解决这个问题的代码是对 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'%>

【问题讨论】:

    标签: ruby-on-rails ruby rubygems


    【解决方案1】:

    需要花点心思,但可以做到。

    首先,选择助手几乎只需要一个数组数组,所以类似于:

    [ ["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 of Arrays,看显示文本(每个Array的第一个元素)是否为空白。因为您实际上将 " " 作为字符串返回,所以此检查会删除空格,然后查看结果字符串是否为空白。如果是这样,它将删除该元素。最终的 Array 将只包含那些显示包含一些非空白字符的元素。

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

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

    希望有帮助!

    【讨论】:

    • 嘿@GoGoCarl,在缩进方面做得很好,我的美化器快死了:D:D,我肯定需要做一些挖掘才能完全理解这个问题,我也尝试使用.reject 选项但不知道数组背景。看起来真的很合法,非常感谢你,我很快就会回来:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多