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
不允许对布尔值进行验证。