И то, и другое - плохие способы:
@user = UserService.build_user(params) # just instanciate the record
if @user.save
# ...
else
# ...
end
Есть ли функциональная разница? Да. .save
запускает все обратные вызовы в модели, связанные с сохранением записи, что может иметь побочные эффекты. Если вы хотите просто проверить, сохранен ли он, используйте .persisted?
. .errors.empty?
- плохая имитация .valid?
.
Ни один из них ничего не взорвет, но это все равно вызывает у меня беспокойство, поскольку делает ваши намерения намного менее ясными. И он также создает два запроса (и инициирует обратные вызовы обновления), если вы делаете что-то вроде:
@user = UserService.create_user(params)
@user.foo = bar
if @user.save
# ...
else
# ...
end
, что действительно часто встречается, когда вы хотите объединить параметры с информацией из других источников, таких как сеанс.
render :create, status: :ok
тоже просто странно. Обычно вы хотите просто перенаправить на вновь созданный ресурс, так как это увеличивает историю, чтобы браузер фактически возвращался на нужную страницу вместо /users
, если пользователь нажимает кнопку «Назад». Для API вы можете ответить status: :created, location: @user
или JSON представлением ресурса.