Проверка не пройдена — не может быть пустым — даже если оно не пустое

у меня есть модель

class Card < ActiveRecord::Base
  belongs_to :CardColour
  validates :CardColour, presence:true

В консоли набираю

@a = Card.new(:card_colour_id =1)

Однако это недействительно. Я спрашиваю, почему, делая @a.errors, и консоль говорит мне

=> #<ActiveModel::Errors:0x000000052e57e8 @base=#<Card id: nil, card_colour_id: 1>, @messages={:CardColour=>["can't be blank"]}> 

Я часами смотрел на это, совершенно сбит с толку и не понимаю, почему я, похоже, не могу делать самые простые вещи в Rails.

Я искал вопросы с похожими названиями, но все они кажутся более сложными сценариями. У меня происходит больше, чем этот пример, но ничего более сложного. например, у меня на самом деле настроено 3 внешних ключа, и все они говорят мне, что они не могут быть пустыми, даже если они заполнены допустимыми значениями.

Я нашел этот ответ, который предполагает, что мой код правильный и будет на самом деле делать то, что я хочу (т.е. проверить, что card_color_id ссылается на фактический объект в модели CardColour).


person reedstonefood    schedule 16.06.2016    source источник
comment
Как выглядит ваша CardColour модель? Вы действительно должны попытаться быть немного более идиоматичным с Ruby. Попробуйте пойти с belongs_to :card_colour и validates :card_colour_id, presence: true   -  person Orlando    schedule 17.06.2016
comment
можете ли вы показать свои ассоциации и миграции, пожалуйста?   -  person ruby_newbie    schedule 17.06.2016
comment
Я новичок, но что-то сбивает с толку: CardColour кажется правильной моделью, а также столбцом, который необходимо заполнить, чтобы запись была действительной.   -  person Maxence    schedule 17.06.2016
comment
Закройте, но используйте validates :card_colour, presence: true вместо card_color_id.   -  person Michael Chaney    schedule 17.06.2016
comment
Столбец должен называться card_colour_id.   -  person Michael Chaney    schedule 17.06.2016
comment
@Orlando Орландо, я пытался быть идиоматичным. Это откровенно сбивает с толку. Я отредактировал свой вопрос, я сделал небольшое бу-бу   -  person reedstonefood    schedule 17.06.2016


Ответы (2)


Вы проверяете CardColour, но в консоли создаете новый Card с card_colour_id, но не с CardColour. Вот почему вы получаете ошибку.

Вы должны изменить validates :CardColour, presence :true на validates :your_model's_column, presence :true

person Alex Zakruzhetskyi    schedule 17.06.2016
comment
Это работает! Спасибо! Но, похоже, в качестве card_color_id он примет любое целое число? Я думал, created_to установил отношение внешнего ключа? - person reedstonefood; 19.06.2016

Измените код модели на

class Card < ActiveRecord::Base
  belongs_to :card_colour
  validates :card_colour_id, presence:true

и ваша новая карточная линия для

@a = Card.new(:card_colour_id => 1)

или с новым синтаксисом

@a = Card.new(card_colour_id: 1)
person Sebin    schedule 17.06.2016
comment
Предполагается, что имена классов моделей должны быть CamelCase... так что own_to :CardColour правильно, не так ли? - person reedstonefood; 19.06.2016