ActiveRecord + ActiveAdmin,保存一个空字符串而不是null

ActiveRecord + ActiveAdmin, save a empty string instead of null

当我使用 Active Admin 表单时,空字符串值被保存为“”(空)而不是 NULL 值。

我是否应该在初始化程序中设置一个参数来将 MySQL 中的每个空值保存为 NULL?

form do |f|
    input :label
    input :description, as: :text
    input :country
    input :city
  end
  actions
end

这是我的迁移架构:

create_table "projects" do |t|
  t.string "label", limit: "40"
  t.string "country", limit: "2"
  t.string "city", limit: "200"
  t.string "description", limit: 600
end

这是我的 Gemfile。

gem 'rails', '~> 5.1.0.rc1'
gem 'mysql2', '>= 0.3.18', '< 0.5'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'active_model_serializers', '~> 0.10.5', require: true
gem 'kaminari'
gem 'inherited_resources', '~> 1.7'
gem 'activeadmin', '~> 1.0.0.pre5'
gem 'sidekiq', '~> 4.2.10'
gem "paperclip", "~> 5.1.0"
gem 'aws-sdk', '~> 2.3.0'

这似乎是表单的默认行为。我遇到了 gem nilify_blanks 这将解决您的问题。 希望对你有帮助。

这是一个 Rails,不是 ActiveAdmin 问题。

如果可以的话,don't use null for empty strings。使用 null 在理论上可能是正确的,但在实践中我发现如果所有 varchar 列都设置为非 null,则使用 MySQL 更简单且更不容易出错,例如:

t.string :label, limit: 40, null: false

nilify_blanks gem 自 Rails 4 后就不再维护了。相反,请在您的模型中尝试以下操作:

def label=(label)
  write_attribute :label, label.present? ? label : nil
end