Подтвердить что ты не робот

Rails - создавать и создавать! методы, RoR 3 Tutorial

Итак, я знаю, что различие между знаками (восклицательным знаком) и не-bang обычно заключается в том, будет ли метод изменять сам объект или возвращать отдельный модифицированный объект, сохраняя исходный неизменным.

Затем при построении модели User в главе 6 книги я наткнулся на метод User.create, который создает новую модель и сохраняет ее в базе данных за один шаг. В руководстве Michael Hartl Ruby on Rails 3 он пишет, что метод User.create! работает так же, как метод create... за исключением того, что он вызывает исключение ActiveRecord:: Record-Invalid, если создание терпит неудачу ".

Я довольно смущен. Является ли метод User.create! не следовать правилам Ruby "bang-convention", или я вообще что-то упустил? И если он следит за соглашением, как User.create! изменить self, если это метод класса?

4b9b3361

Ответ 1

Хотя многие классы рассматривают методы bang как "метод, который модифицирует объект на месте", мне больше нравится описание методов bang из Eloquent Ruby book

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

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

Ответ 2

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

Варианты bang (например, save!) создают исключение, если запись недействительна. В версиях non-bang dont: save и update_attributes возвращают false, создают и обновляют, просто возвращают объекты.

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

Изменить: Изменен источник для исправления неработающей ссылки