Ответы:
Есть пара отличий, но они не большие:
.createэквивалентно .newпоследующим .save. Это просто более кратко..create!эквивалентно .newпоследующему .save!(выдает ошибку, если сохранение не удается). Это также просто немного короче.buildэто в основном псевдоним для .new. В Rails 3 он работает одним способом, а в Rails <3.Однако наиболее важной частью является то, что эти методы могут вызываться через ассоциацию ( has_manyи т. Д.) Для автоматической связи двух моделей.
Хотя это правильно, что 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, нельзя falseприводить в качестве аргумента, что вы можете сделать с save. Передача falseв качестве аргумента пропустит все проверки рельсов