2015-10-10 2 views
0

Я создаю приложение Rails, и я столкнулся с действительно странной ошибкой. Код [true false].sample никогда не должен возвращать пустой. Однако иногда это происходит при запуске rake db:seed..sample возвращает nil при посеве Rails app

В моем приложении у меня есть модель магазина, который имеет присутствие валидаций:

class Store < ActiveRecord::Base 
    validates_presence_of :accepts_credit, :parking 
end 

Я также запустить тест в RSpec, как это (что всегда проходит)

require 'rails_helper' 

RSpec.describe Store, type: :model do 
    it { should validate_presence_of :accepts_credit } 
    it { should validate_presence_of :parking  } 
end 

Теперь в моих семян файл у меня есть

Store.create(
    ... 
    accepts_credit: [false, true].sample(1), 
    parking:  %w[lots some none].sample(1), 
    ... 
) 

Запуск в терминале с rake db:reset --trace, я получаю сообщение об ошибке что магазин не был создан. Я проверил это, выполнив Store.create! вместо Store.create, что заставляет терминал отображать ошибки. Validation failed: Accepts credit can't be blank.

Теперь я относительно новичок в Rails, но я не понимаю, почему метод образца .sample может вернуть пустой. Согласно документам: http://ruby-doc.org/core-2.2.0/Array.html#method-i-sample, образец всегда возвращает элемент из массива.

Редактировать

Я использовал .sample в замене из .sample(1), а также.

Что мне не хватает? Есть .blank делать то, что я думаю?

ответ

0

false.blank? является true (т.е. не «присутствует»), так что вам нужно переписать проверку, если вы хотите, чтобы сохраняться false значения. Вы можете попробовать validates_inclusion_of :accepts_credit, in: [true, false], если хотите защитить от nil.

+0

Хорошо, это имеет смысл и была моей первой интуицией, но соглашатели должны сказать, что вы не должны использовать включение в буле. Вот ссылка на документы: https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb. – user3162553

+0

На второй мысли, я думаю, это отвечает на вопрос. Вы не должны проверять наличие булевых элементов, потому что AR будет их выводить. Ваш ответ возникает, когда вы понимаете, что делает AR. Благодаря! – user3162553

+0

AR будет отображать значения после того, как записи были извлечены из БД, поэтому 'Store.last.accepts_credit?' Будет работать как ожидалось, независимо от проверки включения. Тем не менее, может быть важно убедиться, что у вас нет значений NULL в логических полях, потому что такие запросы, как 'Store.where (accepts_credit: false)', не возвращают такие записи. 'FALSE'! =' NULL' в БД. – Ben

0

Я думаю, что вы, возможно, забыли запустить миграцию. Я думаю, что вы должны были бежать: rake db: migrate: reset

Попробуйте запустить, rake db: migrate, а затем, rake db: seed. Я заранее извиняюсь, если этот ответ не поможет.

+0

Я понимаю, что 'rake db: reset' отбрасывает базу данных, создает ее и запускает все миграции, чтобы потом ее семена. – user3162553

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