#ruby-on-rails #ruby
#ruby-on-rails #рубин #ruby
Вопрос:
Что это делает в Rails?
create! do |user|
#initialise user
end
Я понял, что это создает пользовательские объекты и сохраняет их в базе данных. Чем это отличается от простого произнесения user.new(...)
and user.save()
?
Ответ №1:
В двух словах:
create!
вызывает исключение,create
возвращая объект (несохраненный объект, если он не проходит проверки).save!
выдает ошибку приsave
возвратеtrue
/false
.save
не принимает атрибуты,create
принимает.
new
не сохраняет. new
похоже на build
в ActiveRecord
контексте. create
сохраняет в базу данных и возвращает true
или false
в зависимости от проверки модели. create!
сохраняется в базе данных, но вызывает исключение, если есть ошибки в проверке модели (или любая другая ошибка).
Комментарии:
1. Я поддержал, потому что это хороший ответ. Однако,
create
не возвращает логическое значение. Он возвращает экземпляр объекта независимо от того, прошел он проверку или нет.2. @AdityaSanghi — спасибо за ваш ответ. вы говорите: «создайте! сохраняется в базе данных, но вызывает исключение, если есть ошибки в проверке модели (или любая другая ошибка).» ———> как он может сохранить что-либо в базе данных, если проверки не переданы?
3. @bkspurgeon это не сохраняется, если проверки завершаются неудачей. Метод bang в случае сбоя ведет себя иначе, чем версия без bang. Версия Bang вызывает исключение, а версия без bang возвращает false .
Ответ №2:
Когда не удалось создать запись, create!
генерируется исключение, new
а затем save
(или просто create
без восклицательного знака) завершается молча.
Ответ №3:
create
принимает атрибуты, поэтому использование блока здесь несколько необычно. Упомянутый вами код выполняет инициализацию в блоке, который передается create!
Ему, в принципе, такой же, new
за которым следует инициализация, а затем save!
Существует множество вариантов save, сохранить!, создать, завершить!, обновить, обновить! и т.д., Также существуют варианты с точки зрения проверок и обратных вызовов
Для получения подробной информации, пожалуйста, ознакомьтесь с API: (это обсуждается по первой ссылке)
http://api.rubyonrails.org/classes/ActiveRecord/Base.html
Комментарии:
1. немного неправильно. создать/create!/сохранить/save! все они немного отличаются. создать/create! возьмите атрибуты модели. сохранить/save! не принимайте параметры атрибута модели. методы с bang (создать! / сохранить!) вызывают исключение при сбое проверки, а методы без bang (создать / сохранить) — нет.
2. также save не возвращает nil, он возвращает результат проверки (true или false).
3. это смешно. Я никогда не говорил, что
save
это будет принимать аргументы. Я указал на соответствующую документацию — чем это не так??