2015-12-29 3 views
1

Переменная 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 

Кто-нибудь понимает, почему он хочет создать статья с пустой var?

Update: Используя debugger, я могу подтвердить, что переменная имела значение 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

Я также попытался 'переменная = [0, 1] .sample', но это не имеет никакого значения. Я также использую '.sample' в других местах семян, без проблем. – Marty

ответ

1

should not be allowed to be blank

Лучший способ будет установить default значение в db.

Это не только освободить рельсы перерабатывающие мощности, но и убедиться, что независимо от того, что значение имеет присутствовать, необходимость в 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 

Таким образом, вы» ll всегда имеет boolean как false, если это значение отсутствует. Я знаю, что это не то, о чем вы просите, но в любом случае будет лучшим решением.


С точки зрения вашей проверки, вы хотите использовать новую validates стенографии:

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

Согласно комментариям на this question, вы не должны иметь presence для значения boolean:

Note that you cannot have the usual validation for the presence (validates :field, presence: true) for a boolean field (the field would not be valid for a false value).

But in both Rails 3 and 4, having validates :field, inclusion: [true, false] would test for inclusion in a list of values, with the side-effect to test for the field's presence (unless one of those values is nil of course). – Martin Carel Jul 14 at 19:38

... так что вы должны использовать следующее:

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

Another good ref

+0

Спасибо за объяснение! – Marty

+0

Объяснение - одно дело, заставить его работать другое :) Было бы интересно узнать, работает ли оно или нет –

+1

Я действительно получил его для работы, удалив строку 'validates: var, presence: true'. Как оказалось, «присутствие» не является допустимой проверкой для булевых. – Marty

Смежные вопросы