2016-09-17 2 views
0

Я следую видеоуроку, сделанному в июне 2012 года. Версия Ruby версии 1.9.3 и Rails версии 3 в то время. Теперь я тестирую примеры кода в Rails 5.0.0.1.Rails 5.0.0.1: не удается создать экземпляр класса из консоли?

Мы знаем, что в настоящее время strong parameters должно использоваться в действии create. Это также применимо при использовании консоли для создания экземпляра объекта класса?

В упражнении модель Пользователь был создан: rails g scaffold user name movie. Следующая инструкция была rake db:migrate (конечно), а затем зайти в консоль и создать запись пользователя. Все шло хорошо; запись создана и сохранена со всеми полями, имеющими значение.

Но теперь приходит та часть, где мой вопрос о том: следующая команда была:

rails g scaffold car user:belongs_to condition year:integer.

OK; rake db:migrate и откройте консоль. Это произошло, когда я хотел создать запись в автомобиле:

>> car = Car.create(year: 2003, condition: 'ok') 
    (0.2ms) begin transaction 
    (0.1ms) rollback transaction 
=> #<Car id: nil, user_id: nil, condition: "ok", year: 2003, created_at: nil, updated_at: nil> 

Запись не была создана! Я подозреваю, что это связано с strong parameters в Rails 4 и 5?

Наконец, здесь мои вопросы:

  • Что пошло не так? И есть ли альтернативный способ, используя консоль для создания?
  • Это из-за отношения модели автомобиля: belongs_to :user?
  • Я знаю, что есть драгоценности, которые «имитируют» состояние до введения сильных параметров, но я бы предпочел не использовать их; это похоже на обман!
+0

Вы не указали пользователю автомобиль. Осмотрите «car.errors», и вы поймете, почему он не был сохранен. –

+0

@ Сергио Туленцев: вы правы! Я предоставил '' 'id''' и' '' user_id''', и теперь я _can_ создаю новую запись! Спасибо! Я думал, что '' 'id''' будет автоматически генерироваться, но, очевидно, в этом случае нет! –

+0

Кроме того: я не могу создать с '' 'user_id''' несуществующего пользователя! У Rails есть много скрытых __gems__ для меня! –

ответ

2

Rails 5 требует сообществ belongs_to по умолчанию начиная с this PR.

Вы можете указать, что поле является необязательным, используя belongs_to :user, optional: true.

Кроме того, если ваша модель не позволяет сэкономить, часто бывает полезно взглянуть на ее объект errors.

Вы можете сделать это, сделав что-то вроде puts car.errors.

Сильные параметры не повлияют ни на что, что вы делаете на консоли. Все дело в том, чтобы переместить защиту массового назначения из моделей и в контроллеры.

+0

Смешно: я могу создать запись только давая в существующем '' 'user_id''', оставляя все остальные параметры!Потому что в классах нет '' 'validates'''? Учебник (помните, начиная с 2012 года) показывает, что user_id был '' 'nil''', но с текущей версией Rails это невозможно ... –

+0

Да,' user_id' - единственное обязательное поле, t есть какие-либо другие проверки на модели «Car». Если вы сделаете поле 'user_id' дополнительным, выполнив бит' optional: true', тогда вы сможете создать новый 'Car' без параметров, например:' car = Car.create! 'И' car 'будет действительным. Например. 'Car.is_valid? == true'. – dinjas

+0

Посмотрите, что я сделал! Я все еще могу обмануть: «код» >> автомобиль = автомобиль.первый Автомобильная нагрузка (0,3 мс) ВЫБРАТЬ «автомобили». * ОТ «автомобилей» ЗАКАЗАТЬ «автомобили». «Id» ASC LIMIT? [["LIMIT", 1]] => # <Идентификатор автомобиля: 1, user_id: 1, условие: "ok", year: 2003, created_at: "2016-09-17 17:23:43", updated_at: «2016-09-17 17:23:43»> >> car.update_attribute (: user_id, nil) 'code' Извините; Я не понимаю, как помещать код в комментарий :-( Все, что я хочу показать, это то, что user_id может быть установлен на ноль, снова. –

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