【问题标题】:How to save 'Yes' or 'No' instead of 'true' or 'false' with Rails check_box form helper?如何使用 Rails check_box 表单助手保存“是”或“否”而不是“真”或“假”?
【发布时间】:2017-07-06 01:54:15
【问题描述】:

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

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

【问题讨论】:

  • d/b 模式中的“响应”字段是什么数据类型?
  • responding 属性是数据库中的字符串字段。
  • 你确定它是一个字符串吗?表的架构是什么样的?
  • 是的,我很确定;架构读取:t.string "responding", limit: 255.
  • 当然,我刚刚取消删除它。

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


【解决方案1】:

来自fine manual

8.6。布尔类型
[...]
“真”状态的有效文字值为:

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

对于“假”状态,可以使用以下值:

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

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

如果您将布尔列设置为'yes',那么当您在Rails 中访问该值时,您将返回true'yes' 是 SQL 中 TRUE 的别名,Rails 用 Ruby 的 true 表示 TRUE SQL 布尔值。 'no'false 也是如此。

当您显示模型时,最好将truefalse Ruby 值转换为'Yes''No',而不必担心数据库中布尔值的具体表示。


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

【讨论】:

    【解决方案2】:

    所以,如果你使用

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

    对于普通的form_for @recipient,它应该为您提供一个值为yes 的复选框。如果 check_box 被选中,则保存的值为“是”。使用 :string 作为列。如果未选中的值为“否”。 这将是正常程序。好吧,我只能看到你使用的是复选框而不是 check_box。

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

    【讨论】:

    • 我正确迁移;来回几次,看看它对布尔值的表现如何。 checkbox 是这里的错字,我会更正它。重新启动服务器后问题自行解决(令人惊讶的是,通常我不会在迁移后重新启动服务器)。它现在按预期运行。谢谢。
    • 您应该在运行迁移后重新启动服务器。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多