如何从Rails中的f.select中删除Null值?

时间:2019-01-22 20:48:00

标签: ruby-on-rails

选择项目时,我有多个下拉菜单。它还会创建空值。如何从该数组中删除空值?

 = f.select(:doc, file.all.collect {|a| [a.name, a.id]}, {}, id: "id-select2", class: "form-control", :multiple => true). 

4 个答案:

答案 0 :(得分:0)

您可以使用signal-safety(7)。例如:

compact

使用a = [nil, 2, 3, 4, 5] without_nil = a.compact # [2, 3, 4, 5] 将修改原始数组,而compact!返回一个新数组。

答案 1 :(得分:0)

那里有两个问题

您的collection返回的是nil个元素(如Joseph所说),在这种情况下,name属性就是可以为nil的元素,因此您可以在collect上进行检查

解决方案(紧凑)[更新]

f.select(:doc, file.all.collect {|a| [a.name, a.id] if a.name, include_hidden: false }.compact, {}, id: "id-select2", class: "form-control", :multiple => true)

指定include_blank选项https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-select

f.select(:doc, file.all.collect {|a| [a.name, a.id] if a.name }.compact, { include_blank: false, include_hidden: false }, id: "id-select2", class: "form-control", :multiple => true)

根据select helper的文档,我发现了这个问题

  

HTML规范说明传递多个参数以选择时   并且所有选项都被取消选择的Web浏览器不会向发送任何值   服务器。不幸的是,这引入了一个陷阱:如果用户模型   许多角色,并且具有role_ids访问器,并且具有编辑形式   用户的角色,用户从role_ids中取消选择所有角色   选择框,不发送任何role_ids参数。因此,任何大规模分配   为了防止这种情况,帮助程序会生成一个辅助隐藏的   多个选择之前的字段。隐藏字段具有相同的名称   作为多项选择和空白值。

     

注意:客户端要么仅发送隐藏字段(代表   取消选择多个选择框),或两个字段。这意味着   结果数组始终包含一个空字符串。

     

如果您不希望帮助程序生成此隐藏字段,则可以   可以指定include_hidden:false选项。

因此,如果添加 include_hidden:false 选项,则在将数据发送到控制器时,多重选项将不会得到空字符串。

答案 2 :(得分:0)

例如,您可以在数据库查询中对此进行过滤(我假设file.where('name IS NOT NULL').load 是主键且不为null):

rx = r'^([S])([Nn]+)([m])([f]|[d])$'

t = re.match( rx , 'NNmf' )

print( t.groups() )

答案 3 :(得分:0)

RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); 对您不起作用,因为您可能会根据compact的结果来调用它。如果您有一个像collect这样的数组,则在其上调用[['a', 1], ['b', nil]]不会做任何事情,因为compact不是['b', nil]。它只包含它。因此,您需要避免将nil放在File的地方。

您想要的是这样的东西:

name == nil

如果我们确切知道f.select(:doc, file.where('name IS NOT NULL').collect { |f| [f.name, f.id] }, {}, id: "id-select2", class: "form-control", multiple: true) 是什么,那可能会更有帮助。