#ruby-on-rails #ruby-on-rails-3 #forms
#ruby-on-rails #ruby-on-rails-3 #формы
Вопрос:
Мне нужно выполнить проверку для моей формы сообщения, где пользователь вводит электронное письмо, и электронное письмо направляет форму на идентификатор человека, который получит сообщение.
Email:<br />
<%= f.text_field :to %>
<%= error_message_on @message, :to %>
...
<%= submit_tag "Send" %>
Моя проблема в том, что мне нужно создать проверку для этой формы, чтобы принимать только электронные письма, но в модели сообщений нет самого электронного письма. Что было бы лучшей попыткой?
Создание похоже на это
def create
@message = Message.new(params[:message])
@message.sender = @profile
@message.recipient = Profile.find_by_email(params[:message][:to])
if @message.save
flash[:notice] = "Message sent"
redirect_to profile_messages_path(@profile)
else
render :action => :new
end
end
Заранее спасибо!
—-РЕДАКТИРОВАТЬ—-
Как я сказал в комментарии выше, я добавил в message.rb строку
validates :to, :format => { :with => email_regex, :message => "Email possui formato incorreto" }
Но, выполняя некоторые тесты, я обнаружил, что больше не могу открывать свои сообщения, я получаю сообщение об ошибке:
Validation failed: To Email possui formato incorreto
Есть какие-нибудь подсказки?
Ответ №1:
Эта строка
@message = Message.new(params[:message])
должно выдать ошибку, если в модели сообщений нет метода to= . Итак, я предполагаю, что у вас уже есть такой «виртуальный атрибут», поэтому давайте скажем что-то вроде этого:
def to
@to
end
def to=(value)
@to = value
end
для проверки правильности адресов электронной почты вы могли бы добавить это в модель:
validate :validate_email
def validate_email
errors.add :to, :invalid unless to.match /some email validation regex/
end
Я надеюсь, что это поможет.
Комментарии:
1. Спасибо! Я использовал вашу идею и создал решение. Я создал
validates :to, :format => { :with => email_regex, :message => "Email possui formato incorreto" }
в message.rb и все получилось. Если кому-то нужно, регулярное выражение, которое я использовал, являетсяemail_regex = /A[w -.] @[a-zd-.] .[a-z] z/i
Ответ №2:
Итак, если я правильно понимаю, вы получаете электронное письмо, которое вы просто не хотите сохранять в своей модели, потому что такого поля нет.
Способ сделать это — использовать form_tag вместо form_for для создания пользовательской формы. Затем у вас может быть столько атрибутов, не относящихся к модели, сколько вы хотите.
Чтобы проверить, является ли это правильным письмом, вы должны получить параметры в своем действии create и иметь метод, который проверяет, является ли это действительным электронным письмом. В противном случае будет выдано сообщение об ошибке и перенаправление на страницу, если вы этого захотите.
Комментарии:
1. Спасибо за ответ. На самом деле, я хочу заставить пользователя вводить электронное письмо в
text_field
. То, как сейчас выглядит форма, работает, но я не знаю, как добавить проверку для формата электронной почты (например, регулярное выражение).2. Да, вы можете сделать это, как я описал выше. Вы получаете электронное письмо, которое было написано в форме. Тогда у вас есть метод, который проверяет правильность. Допустимый формат электронной почты должен быть похож на «/^ ([^ @s] )@((?:[- a-z0-9] .) [a-z]{2,})$/i».
Ответ №3:
вы можете выполнить проверку на стороне клиента с помощью javascript, или вы могли бы выполнить пользовательские проверки: http://www.perfectline.ee/blog/building-ruby-on-rails-3-custom-validators (используете ли вы rails 3?)
Комментарии:
1. Да, я использую Rails 3. Я посмотрю на ссылку, которую вы отправили, спасибо!