Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails -- create and create! methods, RoR 3 Tutorial

So I know the distinction between the bang (exclamation mark) and non-bang methods usually is whether the method will modify the object itself or return a separate modified object keeping the original unchanged.

Then while building the User model in chapter 6 of the book, I came across the User.create method, which creates a new model and saves it to the database in a single step. In Michael Hartl's Ruby on Rails 3 Tutorial, he writes that the User.create! method "works just like the create method...except that it raises an ActiveRecord::Record-Invalid exception if the creation fails."

I'm pretty confused. Is the User.create! method not following Ruby "bang-convention" or am I completely missing something? And if he IS following the convention, how does User.create! modify self if it is a class method?

like image 295
Kvass Avatar asked Jun 11 '11 15:06

Kvass


2 Answers

Though a lot of classes treat bang methods as "a method that modifies the object in place", I like the description of bang methods from the Eloquent Ruby book better:

In practice, Ruby programmers reserve ! to adorn the names of methods that do something unexpected, or perhaps a bit dangerous

So in this case, the "unexpected" result is that an exception is raised instead of just failing and returning false.

like image 132
Dylan Markow Avatar answered Oct 02 '22 13:10

Dylan Markow


Hope this helps as well:

The bang versions (e.g. save!) raise an exception if the record is invalid. The non-bang versions don’t: save and update_attributes return false, create and update just return the objects.

Source: http://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

Edit: Changed source to fix broken link

like image 31
KcC0 Avatar answered Oct 02 '22 12:10

KcC0