Rails如何使用下拉列表来处理布尔类型的字段?

3
我正在使用Rails 5.1.4,并且在使用select标签处理布尔字段时遇到问题。这是我的表单代码:
= f.select :insurance_authorization_required, options_for_select([["Yes", true], ["No", false]]), { :prompt => 'Select One'} , { :class => 'dropdown' }

我还会验证字段是否存在:
validates :insurance_authorization_required, presence: true

选择 可以正确保存为 true,但是如果我选择 ,会出现错误信息:insurance_authorization_required 不能为空。我尝试使用 01

= f.select :insurance_authorization_required, options_for_select([["Yes", 1], ["No", 0]]), { :prompt => 'Select One'} , { :class => 'dropdown' }

但这会得到相同的结果:选择“是”保存为true,而选择“否”则会抛出一个错误。

我还尝试在我的模型中强制转换字段:

def insurance_authorization_required=(val)
  if val.is_a?(TrueClass) || val.is_a?(FalseClass)
    super(val)
  else
    super(val == 'true' || val == '1')
  end
end

这也没有解决问题。当选择“否”时,我仍然收到空白错误。

我看到了其他多个类似的问题,接受的答案是使用 truefalse 作为我的选择选项值将起作用,但为什么对我不起作用?我错过了什么吗?

1个回答

2
在Rails中,false被认为是空的。您可以在rails控制台上尝试:

enter image description here

您应该删除存在验证,并将字段设置为默认为false。或者,由于它是布尔值,将true视为true,将false或nil视为false。

1
谢谢!我确实将字段默认为false,但只是想检查是否存在以确保。我完全忘记了false被认为是空白,我想我真的需要周末休息。哈哈,我想我真的需要周末休息。 - Ccyan
1
很高兴能够帮助! - Aleksandrus
1
哇,谢谢。我也遇到了同样的问题,一直想不通为什么它会说属性不能为空@Aleksandrus - Hanmaslah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接