2010-06-14 5 views
2

Поэтому я использую проверки модели ActiveRecord для проверки формы в приложении RESTful.ActiveRecord Создать (не!) Бросок Исключение при проверке

У меня есть создать действие, которое делает:

@association = Association.new 

и приемный конец формы создает хэш данных атрибутов из параметров формы для сохранения в базу данных с помощью:

@association = user.associations.create(data) 

Я хочу просто выполнить действие create, если проверка не удалась. Проблема в том, что метод .create (not!) Бросает исключение в случаях, когда проверка модели не выполняется. Пример:

validates_format_of :url,   :with => /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix, :message => "Your url doesn't seem valid." 

в модели производит:

ActiveRecord::RecordInvalid Exception: Validation failed: Url Your url doesn't seem valid. 

Я думал .create! Предполагается бросить исключение, тогда как .create нет.

Я что-то упустил?

Рубин 1.8.7 173 & номера патчей Рельсы 2.3.3

ответ

6

Прочитайте документацию create и create! тщательно.

Оба create и create! проверяют обратные вызовы (в вашем случае проверки). create метод возвращает false, если исключение возбуждено и истинно, если нет, то create! метод поднял исключение, если запись недействительна.

Однако createможет бросить ActiveRecord::RecordNotUnique, если у вас есть уникальный индекс в базе данных и не проверок, установленных на модели. В этом случае вы должны добавить validates :fieldname, uniqueness: true на модель.

+0

Как можно определить ложное возвращение создания, когда оно бросает исключения? Нужно ли обрабатывать исключение только для того, чтобы выяснить, что проверка не выполнена? – onyxrev

+8

не совсем корректно, '.create' может вызывать ActiveRecord :: RecordNotUnique, если у вас есть уникальный индекс и нет проверки –