Определенно, здесь есть много вещей, которые нужно улучшить, сначала позвольте мне четко ответить на ваш вопрос:
validates: email, uniqueness: true
При добавлении этой проверки в вашу модель контакта метод обновления вернет false
, чтобы электронное письмоне будет обновляться.Вы также можете игнорировать case_sensitivity, добавив case_sensitive: false
к проверке.Следует помнить, что эта проверка не гарантирует уникальности, если у вас несколько серверов / серверных процессов (например, запущен Phusion Passenger, несколько Mongrels и т. Д.) Или многопоточный сервер.Пожалуйста, проверьте этот ответ для расширенного объяснения.
Однако, это не будет работать в коде, который вы вставили выше, позвольте мне объяснить, почему:
1) Метод обновлениятребует передачи 1 аргумента, поэтому ваш код будет выдавать ArgumentError
.
2) render
появляется более одного раза в одном и том же методе: Это приведет к следующей ошибке
Рендеринг и / или перенаправление вызывались несколько раз в этом действии.Обратите внимание, что вы можете вызывать только перенаправление render или не более одного раза за действие.Также обратите внимание, что ни перенаправление, ни рендеринг не прекращают выполнение действия, поэтому, если вы хотите выйти из действия после перенаправления, вам нужно выполнить что-то вроде «redirect_to (...) и return».
Вам нужно будет выполнить рефакторинг своего кода там.
Для redirect_to: root
, сначала убедитесь, что вы настроили корневой маршрут.
3) Эта строка Contact.new(contact_params)
не возвращает существующую запись.Новый метод создает экземпляр объекта, поэтому вы ничего не будете обновлять там.
Возможное решение для вашего метода может быть:
helper_method :contact
def update
if contact.update(contact_params)
flash[:success] = "Contact updated"
redirect_to :root
else
render :edit
end
end
private
def contact
@contact ||= Contact.find(params[:id])
end
Надеюсь, это поможет.