#ruby-on-rails #validation
#ruby-on-rails #проверка
Вопрос:
Я пытаюсь добавить контактную форму для заполнения пользователями, и она автоматически отправится по электронной почте в основную учетную запись. Я не уверен, как я могу добавить проверку в форму, чтобы пользователи не могли нажать «Отправить электронное письмо» без заполнения полей.
В настоящее время я пытался добавить Website: <input type="url" name="website" required>
приложение / просмотры /contact_mailer/contact_email.html.erb:
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Contact Us Form</h1>
<p>
From: <%= @params['name'] %>
</p>
<p>
Email: <%= @params['email'] %>
</p>
<p>
Message: <%= @params['message'] %>
</p>
</body>
</html>
Контактная форма:
<h1>Any enquiries:</h1>
<center><form name="htmlform" method="get" action="/pages/send_form">
<table width="700px">
<form id="contact_form" action="#" method="POST" enctype="multipart/form-data">
<div class="row">
<label for="name">Your Name:</label><br />
<input id="name" class="input" name="name" type="text" value="" size="30" /><br />
</div>
<div class="row">
<label for="email">Your Email:</label><br />
<input id="email" class="input" name="email" type="text" value="" size="30" /><br />
</div>
<div class="row">
<label for="message">Your Message:</label><br />
<textarea id="message" class="input" name="message" rows="7" cols="30"></textarea><br />
</div>
<input id="submit_button" type="submit" value="Send email" />
</form>
В настоящее время электронное письмо по-прежнему отправляется на учетную запись без какой-либо проверки, такой как «Вы должны заполнить это поле»
Комментарии:
1. вы должны добавить код вашей формы
2. @Julien Пожалуйста, посмотрите обновленный пост
3. почему у вас есть 2 элемента формы?
Ответ №1:
Создайте модель для вашего контактного сообщения. Что-то вроде:
class ContactEmail
attr_accessor :name, :email, message
end
Затем include ActiveModel::Model
, чтобы получить проверку ActiveModel и указать модели, какие поля следует проверять, например:
class ContactEmail
include ActiveModel::Model
attr_accessor :name, :email, message
validates :name, :email, message, presence: true
end
Наконец, в вашем действии контроллера создайте новый ContactEmail с данными формы и вызовите метод predicate valid?
. И используйте flash
для добавления сообщения об ошибке.
new_mail = ContactEmail.new(params['name'], params['email'], params['message'])
if new_mail.valid?
...
else
flash.now[:error] = new_mail.errors.full_messages
end
Комментарии:
1. OP запросил решение для предотвращения отправки формы, а не для обхода и проверки на стороне сервера
2. Хотя добавление
required
атрибута является отличным, проверка ДОЛЖНА выполняться на стороне сервера, чтобы предотвратить вмешательство. Выполнение проверки как на стороне клиента, так и на стороне сервера — это именно то, что я бы сделал.3. я полностью согласен, я просто заявляю, что это не то, о чем просил OP
4. Из любопытства, какой именно вид вмешательства предотвращает проверка на стороне сервера? И
ContactEmail
это не модель rails, не так ли? Похоже, что это PORO.5. Я могу проверить элемент ввода, просмотреть его в инструментах разработчика и удалить
required
атрибут из DOM. Он отправит, без проблем. Использованиеrequired
атрибута на входе — это хороший UX, но на него не следует полагаться. И да, это обычный старый объект ruby, но строкаinclude ActiveModel::Model
предоставляет ему методы, которые я обсуждал.
Ответ №2:
Не могли бы вы использовать атрибуты HTML-формы? Существует обязательный атрибут, поэтому пользователь не может оставить поле пустым. например,
<input required id="email" class="input" name="email" type="email" value="" size="30" />
вы также можете использовать тип = «email», и это обеспечит некоторое правильное форматирование.
Ответ №3:
Глядя на код вашей формы, я вижу несколько проблем:
- у вас есть 2
<form>
открытия - я не вижу никаких
file
входных данных, поэтому вам не нужноenctype="multipart/form-data"
вот пересмотренный код (я удалил первый элемент формы, я скорректировал action
вторую форму, я добавил required
атрибуты к входным данным и текстовой области, и я обновил тип ввода электронной почты до «email», чтобы убедиться, что вводятся только действительные электронные письма). Добавление required
должно заставить современные браузеры предотвращать отправку формы, если входные данные не заполнены должным образом.
<h1>Any enquiries:</h1>
<center>
<table width="700px">
<form id="contact_form" action="/pages/send_form" method="POST">
<div class="row">
<label for="name">Your Name:</label><br />
<input id="name" class="input" name="name" type="text" value="" size="30" required /><br />
</div>
<div class="row">
<label for="email">Your Email:</label><br />
<input id="email" class="input" name="email" type="email" value="" size="30" required /><br />
</div>
<div class="row">
<label for="message">Your Message:</label><br />
<textarea id="message" class="input" name="message" rows="7" cols="30" required></textarea><br />
</div>
<input id="submit_button" type="submit" value="Send email" />
</form>