变量var
是boolean
,不应该被允许为空。因此,在我的模型文件中,我有:
validates_inclusion_of :var, :in => [true, false]
validates :var, presence: true
在我的种子文件中,我有:
title = "abc"
var = [true, false].sample
author.articles.create!( title: title,
var: var)
播种会产生错误:
ActiveRecord::RecordInvalid: Validation failed: Var can't be blank
是否有人理解为什么要创建包含空白变量的文章?
更新:使用debugger
,我可以确认var的值为1.
文章架构:
create_table "articles", force: :cascade do |t|
t.integer "author_id"
t.string "title", limit: 50, null: false
t.boolean "var", default: true, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
答案 0 :(得分:1)
不应该被允许为空白
更好的方法是在数据库中设置default
值。
这不仅会释放Rails的处理能力,而且还会确保无论什么, 存在值,boolean
的必要性:
$ rails g migration AddDefaultToBool
# db/migrate/add_default_to_bool____________.rb
class AddDefaultToBool < ActiveRecord::Migration
def change
change_column :articles, :var, :boolean, default: false
end
end
$ rake db:migrate
这样,如果值不存在,您将始终将boolean
设为false
。我知道这不是你所要求的,但无论如何都会是一个更好的解决方案。
就验证而言,您需要使用较新的validates
简写:
#app/models/article.rb
class Article < ActiveRecord::Base
validates :var, presence: true, inclusion: [:true, :false]
end
根据对this question的评论,presence
值不应为boolean
:
请注意,您无法对
validates :field, presence: true
的状态(boolean field
)进行常规验证(该字段对于错误值无效)。但是在Rails 3和4中,
validates :field, inclusion: [true, false]
会测试是否包含在值列表中,副作用是测试字段的存在(除非其中一个值当然为零)。 - Martin Carel 7月14日19:38
...所以应能够使用以下内容:
#app/models/article.rb
class Article < ActiveRecord::Base
validates :var, inclusion: [:true, :false]
end