我还是对Rails和simple_form还是陌生的,并且一直在尝试实现多项选择选项以赋予用户多个角色。
当前输入看起来像这样
<%= f.input :secondary_role, :collection => UseridRole::VALUES, :include_blank => false,:label => "Secondary Role(s):", :input_html => { :class => " simple_form_bgcolour simple_form_position overide_selection_field_width", :size => 4, multiple: true } %>
所以,这确实可行,但在我的数组开头包含一个空值:
"secondary_role" : [
"",
"admin"
]
我有相同的代码,上面的代码适用于我的primary_role值,它是一个字符串,但是我的secondary_role可以有多个值,因此存储为数组。
我应该在哪里解决此问题?
答案 0 :(得分:3)
Rails似乎正在向集合添加一个隐藏字段。尝试将include_hidden: false
添加到表单输入中。
答案 1 :(得分:2)
有多个选项可以避免空值进行多重选择。
与网络开发人员的大多数事情一样,有一百种方法可以使这只猫皮肤化。
如果选择,可以在JS中捕获表单,删除空字符串,然后调用form.submit-在这种情况下,与其他选项相比没有真正的好处
您可以在params方法中使用拒绝空值
def object_params
obj_p = params.require(:user).permit(:primary_role, secondary_role: [] )
obj_p[:secondary_role].reject! { |role| role if role == ""}
up
end
#app/models/object_model.rb
before_save :remove_blanks
private
def remove_blanks
self.secondary_role.reject!(&:blank?).to_s
end
如果该选件可能在控制器外部进行了更新,那么DRYer方式就在模型中。
如果要捕获已删除的数组元素,则不能删除所有空格,如果数组中还有一个项目(至少一个),则它可以工作,但是如果删除所有元素,它根本不会将form元素传递给控制器。
使用表格指示用户将其设置为nil并使用上面的模型方法:
<%= f.input :secondary_role, :collection => UseridRole::VALUES, :include_blank => "Remove All Secondary Role(s)", :label => "Secondary Role(s):", :input_html => { :class => " simple_form_bgcolour simple_form_position overide_selection_field_width", :size => 4, multiple: true } %>
此外,如果选择了该选项,则我可能会使用javascript取消选择其他所有内容,只是使用户对即将发生的事情显而易见。
像这样的js片段
var el = document.querySelector("#user_secondary_role")
el.addEventListener('change', function() {
if (el.value == "") {
roles = el.querySelectorAll("option")
for (var value of roles) {
(value.value == "") ? value.selected = true : value.selected = false
}
}
});
然后在模型中,对选项3中最后列出的before_save调用使用remove_blanks方法。
故障。这是正在发生的事情。