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
Ответы
Ответ 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