【发布时间】:2019-12-11 00:32:15
【问题描述】:
我在:
Rails v4.2.11
Ruby v2.4.4
MySQL 5.7
我有以下导轨型号
# app/models/UnsupportedInstitution.rb
class UnsupportedInstitution < ActiveRecord::Base
attr_accessor :bank_name, :reason
validates :bank_name, presence: true
validates :reason, presence: true
has_many :unsupported_institution_routing_numbers
end
这是模型的迁移:
class CreateUnsupportedInstitutions < ActiveRecord::Migration
def change
create_table :unsupported_institutions do |t|
t.string :bank_name, null: false
t.string :reason, null: false
t.timestamps null: false
end
end
end
创建以下架构
create_table "unsupported_institutions", force: :cascade do |t|
t.string "bank_name", limit: 255, null: false
t.string "reason", limit: 255, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
这似乎都很基本。但是,当我进入 rails 控制台并尝试这样做时:
UnsupportedInstitution.create!(bank_name: 'Hello', reason: 'World'})
我收到以下错误:
INSERT INTO `unsupported_institutions` (`created_at`, `updated_at`) VALUES ('2019-12-11 00:24:22', '2019-12-11 00:24:22')
ActiveRecord::StatementInvalid: Mysql2::Error: Field 'bank_name' doesn't have a default value: INSERT INTO `unsupported_institutions` (`created_at`, `updated_at`) VALUES ('2019-12-11 00:24:22', '2019-12-11 00:24:22')
from /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query'
当我尝试使用更新方法以及尝试创建新实例、设置值然后保存模型时,也会发生这种情况。
很明显bank_name 和reason 属性没有被设置,但我不明白为什么。我怀疑它与迁移中的“null:false”有关,但我无法删除它,因为除了我的 api 之外可能还有其他来源访问这个特定的端点。
谁能解释为什么会发生这种情况和/或我能做些什么来解决这个问题?
【问题讨论】:
-
从模型中删除
attr_accessor :bank_name, :reason。 -
@Gerry 成功了。您能否解释为什么
attr_accessor方法阻止了属性的保存?也许在下面的回复中,所以我也可以接受它作为答案。我在attr_accessor上阅读了文档,但找不到任何保存它的内容会与数据库列冲突 -
Rails 4.x 不再受支持,可能会使您面临严重的安全风险。如果这是一个新项目,或者如果它与实际资金有任何关系,你不应该使用它。同样,Ruby 2.4 即将停产effective March 31, 2020,它很快就会出现。如果可以,请切换到 2.6。这应该是一个简单的升级路径。
-
谢谢@tadman。我会与我的团队分享这些信息并制定升级计划
标签: mysql ruby-on-rails ruby activerecord