Есть ли в Rails 5 функциональная разница между "model.save" и "model.errors.empty?"? - PullRequest
1 голос
/ 10 февраля 2020

Я использую Rails 5. У меня есть этот лог c в моем контроллере ...

@user = UserService.create_user(params)
if @user.errors.empty?
  render :create, :status => :ok

Есть ли разница между вышеупомянутым и

@user = UserService.create_user(params)
if @user.save
  render :create, :status => :ok

I пытаюсь решить, использовать ли ".save" или ".errors.empty?" логи c.

1 Ответ

1 голос
/ 11 февраля 2020

И то, и другое - плохие способы:

@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 представлением ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...