Вопрос

Поэтому я знаю различие между методами Bang (восклицательная отметка) и не Bang Methods, как правило, состоит в том, будет ли метод изменять сам объект или вернуть отдельный модифицированный объект, сохраняя исходный неизвестный.

Затем, создавая пользовательскую модель в главе 6 книги, я наткнулся на User.create Метод, который создает новую модель и сохраняет ее в базе данных за один шаг. В Майкла Хартла Ruby on Rails 3 Учебник, он пишет, что User.create! метод »работает так же, как create метод ... за исключением того, что он поднимает Activerecord :: record-invalid Исключение, если творение не удается. "

Я довольно смущен. Это User.create! Метод, не следующий за рубином "Convenction" или я что-то упускаю? И если он следит за соглашением, как это User.create! изменить себя, если это метод класса?

Это было полезно?

Решение

Хотя многие классы рассматривают методы взрыва как «метод, который изменяет объект на месте», мне нравится описание методов взрыва из Красноречивая книга Рубин лучше:

На практике Руби -программисты резервируют! Украсить имена методов, которые делают что -то неожиданное или, возможно, немного опасное

Таким образом, в этом случае «неожиданный» результат заключается в том, что исключение поднимается вместо того, чтобы просто не удаляться false.

Другие советы

Надеюсь, это также поможет:

Версии BANG (например, сохранение!) Повышают исключение, если запись недействительна. Версии без Bang не: Сохранить и обновлять_аттрибуты возвращают false, создать и обновлять просто возвращать объекты.

Источник: http://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

РЕДАКТИРОВАТЬ: Изменен источник, чтобы исправить разбитую ссылку

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top