Рельсы творить и творить! методы, RoR 3 Учебник

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

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

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


person Kvass    schedule 11.06.2011    source источник


Ответы (2)


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

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

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

person Dylan Markow    schedule 11.06.2011

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

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

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

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

person KcC0    schedule 17.06.2013