使用simple_form条目输入空数组值

时间:2018-07-14 17:44:35

标签: ruby-on-rails simple-form simple-form-for

我还是对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可以有多个值,因此存储为数组。

我应该在哪里解决此问题?

2 个答案:

答案 0 :(得分:3)

Rails似乎正在向集合添加一个隐藏字段。尝试将include_hidden: false添加到表单输入中。

答案 1 :(得分:2)

有多个选项可以避免空值进行多重选择。

与网络开发人员的大多数事情一样,有一百种方法可以使这只猫皮肤化。

选项1:JS捕获并删除

如果选择,可以在JS中捕获表单,删除空字符串,然后调用form.submit-在这种情况下,与其他选项相比没有真正的好处

选项2:强参数控制器捕获

您可以在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

选项3:拒绝模型中的空白

#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方法。

故障。这是正在发生的事情。

  1. 在表单元素中,继续执行include_blank-如果元素为空,这将确保传递“”。接下来,确保include_blank具有标题,其值始终为“”,但是您需要为用户提供一些可以点击的标题。
  2. 添加一些JavaScript,以便当用户确实单击“删除所有辅助角色”时,它们前面的表单会更改,并取消选择其他选项。
  3. 模型方法将删除简单和简单的空格,但是除非您允许传入空格,否则此方法将不起作用,否则您的元素将为空且永远不会到达您的控制器/模型。您可以通过查看development.log并检查POST中传递了哪些参数来进行验证。