【问题标题】:Rails checkbox not storing correct valueRails 复选框未存储正确的值
【发布时间】:2021-01-20 23:24:52
【问题描述】:

我正在使用 Ruby Rails 创建一个表单。它有一个复选框,选中时表示该条目应该被隐藏(true 或 bit 1. vs false/bit 0),但是,当我提交复选框时,我收到一个错误:

Mysql2::Error: Data too long for column 'hidden_status' at row 1: INSERT INTO `entries` ( 'hidden_status') VALUES (x'30')

条目和hidden_status 的架构是:

t.binary "hidden_status", limit: 1

复选框是:

<%= newEntry.check_box(:hidden_status,{checked:true},1,0)%>

我怀疑这与数据类型为“位”有关?但是我不确定,因为我是 Ruby Rails 的新手,从我查找的内容来看,BIT 是在 SQL 中执行布尔值/真值与假值的唯一方法。看起来该值以x'30' 的形式出现。不确定那是什么意思。有没有办法让复选框捕获 1 或 0?

另外,错误中的参数显示无论复选框是否被选中,复选框的值总是返回0。不确定这是单独的问题还是与错误有关。

【问题讨论】:

  • 显示你的控制器端代码

标签: sql ruby-on-rails checkbox bit


【解决方案1】:

截至 2020 年,MySQL 仍未实现真正的布尔列类型。但它确实允许您使用 BOOLEAN/BOOL 声明表:

CREATE TABLE tasks (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    completed BOOLEAN
);

实际创建的是tiny_int(1) 列。虽然目前的建议是使用位列,但我怀疑 Rails 适配器知道如何将其映射到布尔值。

您可以像在真正的成熟数据库中一样在 Rails 中创建迁移 (laughs in Postgres):

class CreateTasks < ActiveRecord::Migration[6.0]
  def change
    create_table :tasks do |t|
      t.string :title
      t.boolean :completed

      t.timestamps
    end
  end
end

schema.rb 仍会将其列为布尔列,因为它是数据库模式的抽象多语言表示,但 MySQL 会将其存储为 tiny_int(1),并且数据库驱动程序将负责将其转换为布尔值,因此您不必这样做在 Rails 中不必处理 1 和 0。

【讨论】:

  • 谢谢,这修复了错误。但是复选框值在参数中仍然显示为 false
  • 您是否尝试删除所有附加参数? newEntry.check_box(:hidden_status)。应该在数据库中设置默认值。
  • 刚刚尝试过,无论是否选中,仍然显示“0”。
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多