проверка модели рельсов в базе данных - PullRequest
1 голос
/ 23 сентября 2011

У меня есть таблица, и у меня есть проверка для настройки уникальности в таблице.например.

создание сообщений в таблице (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE, заголовок varchar (255) уникален, текст контента);

Здесь заголовок уникален.Также нужно сообщить модельному классу об этой уникальности?Если нет, когда я вставляю дубликат заголовка, это дает мне ошибку.Как мне это уловить.В настоящее время рельсы показывают мне обратную трассировку, и я не могу поместить свои собственные сообщения об ошибках

def create
  @f = Post.new(params[:post])
  if @f.save
    redirect_to posts_path
  else
    @flash['message'] = "Duplicated title"
    render :action=>'new'
  end 
end 

Я не перенаправлен на новую и вместо этого показываю большую обратную трассу.

Ответы [ 4 ]

2 голосов
/ 23 сентября 2011

Используйте проверку validates_uniqueness_of .«Когда запись создана, выполняется проверка, чтобы убедиться, что в базе данных нет записи с заданным значением для указанного атрибута (который сопоставляется с столбцом)»

0 голосов
/ 15 октября 2011

Учебное пособие Michael Hartl Rails посвящено проверке уникальности (в поле «email») здесь .Похоже, полное решение уникальности:

  1. Добавьте проверку :uniqueness к модели.
  2. Используйте миграцию для добавления уникального индекса в БД.
  3. Перехват ошибок БД в контроллере.Примером Майкла является Insoshi people_controller - поиск оператора rescue ActiveRecord::StatementInvalid.

Re.# 3, похоже, что Майкл просто перенаправляет на домашнюю страницу при любом исключении оператора DB, поэтому он не такой сложный (и не такой точный), как синтаксический анализ, предложенный @Ransom Briggs, но, может быть, он достаточно хорош, если, как говорит @Omar Qureshiограничение уникальности покрывает 99% случаев.

0 голосов
/ 23 сентября 2011

Да, вы делаете, как отмечено в других ответах, ответ validate_uniqueness_of - http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086. Обратите внимание, что даже если у вас есть проверка в вашей модели, существует состояние гонки, когда Rails может попытаться выполнить две вставки, не подозревая об этом. будучи уникальной записью уже в таблице

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

Поскольку эта проверка выполняется вне базы данных, вероятность того, что повторяющиеся значения будут вставлены в две параллельные сделки. Чтобы гарантировать от этого вы должны создать уникальный указатель на поле. См. Add_index для получения дополнительной информации.

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

0 голосов
/ 23 сентября 2011

Вам нужно будет добавить все проверки в ваши модели. Существует гем под названием schema_validations, который проверит вашу базу данных на предмет валидаций и создаст их в ваших моделях для вас. https://github.com/lomba/schema_validations

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