Ruby on rails .样品在种子中不起作用

Ruby on rails .样品在种子中不起作用,ruby-on-rails,ruby,ruby-on-rails-4,seeding,Ruby On Rails,Ruby,Ruby On Rails 4,Seeding,变量var是一个布尔值,不允许为空。因此,在我的模型文件中,我有: validates_inclusion_of :var, :in => [true, false] validates :var, presence: true title = "abc" var = [true, false].sample author.articles.create!( title: title, var: var) 在我的种子文件中,我有: va

变量
var
是一个
布尔值
,不允许为空。因此,在我的模型文件中,我有:

validates_inclusion_of :var, :in => [true, false]
validates :var, presence: true
title = "abc"
var = [true, false].sample
author.articles.create!( title: title,
                         var: var)
在我的种子文件中,我有:

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
有人知道它为什么要创建一篇带有空白var的文章吗

更新:使用
调试器
,我可以确认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
不允许为空

更好的方法是在数据库中设置
默认值

这不仅可以释放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
根据上的评论,对于
布尔值
您不应该有
存在

请注意,对于
布尔字段
(该字段对于false值无效),您不能对其进行常规的状态验证(
验证:字段,状态:true

但是在Rails 3和Rails 4中,如果有
validates:field,inclusion:[true,false]
将测试是否包含在值列表中,测试字段是否存在会产生副作用(当然,除非其中一个值为nil)Martin Carel 7月14日19:38

。。。因此,您应该能够使用以下各项:

#app/models/article.rb
class Article < ActiveRecord::Base
   validates :var, inclusion: [:true, :false]
end
#app/models/article.rb
类文章

我也尝试了
var=[0,1]。示例
,但没有任何区别。我在种子的其他位置也使用了
.sample
,没有问题。感谢您的解释!解释是一回事,让它工作是另一回事:)我想知道它是否工作,我实际上是通过删除行
validates:var,presence:true
使它工作的。事实证明,
presence
不允许对布尔值进行验证。