Различия между ними.строить.,создавать и.создать! и когда их следует использовать?
Итак, я видел, как люди используют .строить. ,создавать и. создать! в последнее время все чаще и чаще. В чем разница от простого использования .новые и проходят по парам бы объект, а затем .спасти? Есть ли плюсы и минусы? Дает ли использование этих других методов преимущества?
4 ответов
есть несколько отличий, но они не большие:
-
.create
эквивалентно.new
затем.save
. Просто более лаконично. -
.create!
эквивалентно.new
затем.save!
(выдает ошибку при сбое сохранения). Это также просто немного короче - я думаю
.build
is в основном псевдоним.new
. Это работает в одну сторону в Rails 3 и другой способ в Rails
наиболее важной частью, однако, является то, что эти методы могут быть вызваны через ассоциацию (has_many
, etc.) автоматически связать две модели.
хотя create
звонки new
а то save
есть большая разница между двумя альтернативами в их возвращаемых значений.
Save
возвращает true
или false
в зависимости от того, был ли объект успешно сохранен в базе данных или нет. Затем это можно использовать для управления потоком в соответствии с первым примером в вопросе выше.
Create
вернет модель независимо от того, был ли объект сохранен или нет. Этот имеет последствия для кода выше в том, что верхняя ветвь if
оператор всегда будет выполняться, даже если объект не проходит проверку и не сохраняется.
если вы используете create
с логикой ветвления вы рискуете тихими сбоями, что не так, если вы используете new
+ save
.
create!
не страдает от той же проблемы, что и возникает, и исключение, если запись недействительна.
на create
альтернатива может быть полезна в контроллеры где respond_with
используется для ответов API (JSON/XML). В этом случае наличие ошибок на объекте приведет к возвращению ошибок в ответе со статусом unprocessable_entity
, что именно то, что вы хотите от API.
я всегда буду использовать new
+ save
опция для html, особенно если вы полагаетесь на возвращаемое значение для управления потоком.
#create-это более короткая версия new и save. # create! бросает исключение, если проверка не была положительной.
Я бы поддержал вышеуказанные ответы. Плюс за create
нельзя передать false
в качестве аргумента, который вы можете сделать с save
. Проходя false
в качестве аргумента пропустит все проверки rails