Проверка Rails вне модели

#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. Я посмотрю на ссылку, которую вы отправили, спасибо!