如何使用Rails check_box表单助手保存“是”或“否”而不是“真”或“假”?

时间:2017-02-16 19:11:18

标签: ruby-on-rails postgresql checkbox rails-activerecord

我有一个带有@recipient属性的对象responding。比如,我希望responding通过=f.check_box :responding, {}, 'Yes', 'No'存储“是”或“否”,docs表示可能。{/ p>

表单提交YesNo,PostgreSQL UPDATE语句按预期使用YesNo(我在$ rails server终端窗口中看到)。但是 - 无论responding属性的数据类型(布尔值或字符串)如何 - 最终存储在数据库中的内容始终是truefalse。我很困惑。幕后发生了什么?如何强制Rails存储YesNo?我应该(不)?我误解了什么吗?

2 个答案:

答案 0 :(得分:3)

来自fine manual

  

<强> 8.6。布尔类型
  [...]
  &#34; true&#34;的有效文字值州是:

TRUE
't'
'true'
'y'
'yes'
'on'
'1'
     

对于&#34; false&#34; state,可以使用以下值:

FALSE
'f'
'false'
'n'
'no'
'off'
'0'

因此字符串'yes''no'是SQL中truefalse(分别)的有效别名。

如果您将布尔列设置为'yes',那么当您访问Rails中的值时,您将获得true'yes'是SQL中TRUE的别名,Rails表示使用Ruby TRUE的{​​{1}} SQL布尔值。同样适用于true'no'

当您展示模型时,最好将falsetrue Ruby值转换为false'Yes',而不是担心特定的您的布尔值在数据库中。

不确定这是否真的适用,因为对服务器重启以及列类型确实存在一些混淆。 OP想要另一个读取,所以我取消了这个。

答案 1 :(得分:1)

所以,如果你使用

=f.check_box :responding, {}, 'Yes', 'No'

使用正常form_for @recipient它应该会显示一个值为yes的复选框。如果选中check_box,则保存的值为“是”。使用:string for column。如果未选中的值为“否”。 这将是正常的程序。好吧,我只能看到你使用复选框而不是check_box。

它应该是数据类型:string。你确定你使用的是:字符串而不是布尔值?如果使用布尔值,它将保存为true。您是否在更改后正确迁移并检查了 schema.rb ... 但是,我只是想帮忙,但如果这对你不起作用,我不知道问题可能是什么。 希望这可以帮助。祝好运!