2010-01-04 4 views
3

Я заметил, что общая проверка линия ошибки в рельсах:Что именно сохраняет/сохраняет! делать?

if @user.save! 

, а не что-то вроде

Save 
If Save is successful 
Blah 
Else 
Blah 
End 

Так мое понимание «если @ user.save!» заключается в том, что он сохраняет объект и возвращает true/false, если он был успешным. Если я позвоню позже, например:

@user.save! 
if @user.save! 
    blah 
end 

Я выполняю запрос сохранения дважды?

+0

логически ответ должен быть «Да», но я не эксперт Rails –

+0

Не уверен, вы можете обнаружить, что второе сохранение не потрудилось попасть в базу данных, если в объекте ничего не изменилось. Не забудьте проверить, идет ли что-нибудь в файл журнала (logs/development.log в среде разработки) –

ответ

7

Небольшая разница, признаюсь, но, тем не менее, важна. Док здесь неплохо:

save!

С сохранением! проверки всегда выполняются. Если какой-либо из них не срабатывает, ActiveRecord :: RecordInvalid будет поднят.

сохранить (perform_validation = истина)

если perform_validation является истинным валидация работать. Если какой-либо из них не работает, действие отменяется, и сохранение возвращает false. Если флаг является ложным, то проверки полностью исключаются. Дополнительную информацию см. В разделе ActiveRecord :: Validations.

так, сэкономить! будет не просто возвращать истину или ложь, а только правду об успехе и поднять экспимент, если он не удастся.

Целью этого различия является то, что с сохранением !, вы можете поймать ошибки в своем контроллере, используя стандартные средства ruby ​​для этого, в то время как save позволяет вам делать то же самое, используя стандартные if-предложения. По крайней мере, это то, что я думаю.

+0

Спасибо Мориц. Один вопрос сверху, хотя, учитывая мой последний пример сохранения, затем используя «if save!» ... он дважды ударяет db? – Kevin

+0

hm, из моего понимания, слой orm, такой как AR, также оптимизирует материал, а отправка немодифицированного объекта в базу данных для (re) сохранения - это не так уж умно, поэтому я думаю, что нет :-) – moritz

Смежные вопросы