Rails 3 - проверить, что объект действителен с параметрами перед обновлением - программирование
Подтвердить что ты не робот

Rails 3 - проверить, что объект действителен с параметрами перед обновлением

У меня очень новый вопрос. Как я могу проверить, что объект модели действителен с новыми параметрами, прежде чем обновлять его?

Я хочу преобразовать это:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.update_attributes( params[:obj] )
    # That have been updated
  else
    # Ups, errors!
  end
end

Что-то вроде этого:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.valid_with_new_params( params[:obj] )
    @obj.update_attributes( params[:obj] )
  else
    # Ups, errors!
  end
end
4b9b3361

Ответ 1

Чтобы обновить атрибуты без их сохранения, вы можете использовать

@obj.assign_attributes( params[:obj] )

Затем, чтобы проверить, действительно ли объект, вы можете вызвать

@obj.valid?

Если объект недействителен, вы можете увидеть ошибки (только после вызова .valid?), вызвав

@obj.errors

Если объект действителен, вы можете сохранить его, вызвав

@obj.save

Однако, все это обычно не требуется. Если объект недействителен, то ActiveRecord не сохранит объект в базе данных, поэтому все изменения атрибутов будут забыты при выходе из действия контроллера.

Кроме того, поскольку некорректная запись не будет сохранена в базе данных, вы всегда можете просто вызвать Object.find() еще раз, чтобы вернуть исходный объект.

Ответ 2

Вы можете вызвать метод valid? для запуска проверки.

Это не гарантирует, что последующее сохранение будет успешным, если некоторые ваши проверки зависят от состояния других объектов в базе данных. Сохранение может также завершиться неудачей по причинам, не связанным с проверками (например, ограничение внешнего ключа)

Я не уверен, почему вам нужен этот шаблон

Ответ 3

Объект не будет сохранен, если переданный аргумент не приведет к действительному объекту, поэтому вы можете использовать свой способ как можно точнее. Вы можете увидеть ошибки (если есть) с помощью массива @obj.errors.

Ответ 4

update_attributes метод проверяет объект и возвращает false, если объект недействителен. Итак, вы можете просто написать:

if @obj.update_attributes( params[:obj] )
  # That have been update
else
  # Ups, errors!
end

Ответ 5

Ответ заключается в том, что вы можете определить метод

def valid_with_new_params(hash)
   self.attributes = hash
   valid?
end

Но это было бы необязательно, потому что @obj.update_attributes(params[:obj]) возвращает true, если obj был успешно обновлен и false в противном случае. Также обратите внимание, что внутри метод update_attributes выполняет все проверки на @obj, поэтому у вас есть @obj.errors, если обновление не выполнено.

Ответ 6

Обновление атрибутов без сохранения

@obj.attributes = params[:obj]   0r
@obj.attributes = {:name => "Rob"}

Чтобы проверить, действительно ли объект

@obj.valid?

Чтобы проверить, есть ли какая-либо ошибка

@obj.errors