选择项目时,我有多个下拉菜单。它还会创建空值。如何从该数组中删除空值?
= f.select(:doc, file.all.collect {|a| [a.name, a.id]}, {}, id: "id-select2", class: "form-control", :multiple => true).
答案 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)
是什么,那可能会更有帮助。