Ruby on Rails: проверка контактной формы без модели - PullRequest
0 голосов
/ 26 октября 2019

У меня есть простая контактная форма, которая принимает следующие поля (все должны быть обязательными): имя, адрес электронной почты, телефон и сообщение.

Я также хочу подтвердить адрес электронной почты.

Пользователи должны получить ответ о том, была ли форма успешно отправлена, или если есть ошибки.

, если это так, отображать определенные ошибки в представлении.

Эта форма не связана с какой-либо моделью базы данных. Я не сохраняю представления. Только рассылка.

У меня POST-маршрут установлен в contact_form в моем PagesController

В моем PagesController у меня есть

    def contact_form
        UserMailer.contact_form(contact_form_params).deliver
    end

В моем классе UserMailer у меня есть:

 def contact_form(params)
      @formParams = params;
      @date = Time.now
         mail(
            to: "support@example.com",
            subject: 'New Contact Form Submission', 
            from: @formParams[:email],
            reply_to: @formParams[:email],
        )
    end

Это сообщение успешно отправлено, но проверки нет. Мне нужно только запустить почтовый блок, если проверка прошла успешно. затем верните ответ пользователю.

Поскольку у меня нет модели, я не уверен, как это сделать. Все ответы, которые я вижу, говорят людям использовать validates в модели ActiveRecord.

С несколькими ответами:

(обратите внимание, я обновил свои параметры)

class UserMailerForm
  include ActiveModel::Validations

  def initialize(options)
    options.each_pair{|k,v|
      self.send(:"#{k}=", v) if respond_to?(:"#{k}=")
    }
  end
  attr_accessor :first_name, :last_name, :email, :phone, :message

  validates :first_name, :last_name, :email, :phone, :message, presence: true
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP } 
end
 def contact_form
    @form = UserMailerForm.new(contact_form_params)

    if @form.valid?
      UserMailer.contact_form(contact_form_params).deliver
    else
     logger.debug('invalid')
     logger.debug(@form.valid?)
    end

  end

Отправляет почту, когда она действительна. Тем не менее, я все еще не уверен насчет отправки информации пользователю

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Вы можете сделать UserMailer моделью и использовать проверки на этом .

class UserMailer
  include ActiveModel::Model       # make it a model
  include ActiveModel::Validations # add validations

  attr_accessor :name, :email, :phone, :message

  validates :name, :email, :phone, :message, presence: true
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP } 

  def send_mail(subject:, to:)
    mail(
      to: to,
      subject: subject, 
      from: email,
      reply_to: email,
    )
  end
end

Затем использовать его как любую другую модель.

def UserMailersController < ApplicationController
  def new
    @user_mailer = UserMailer.new
  end

  def create
    @user_mailer = UserMailer.new(params)
    if @user_mailer.valid?
      @user_mailer.send_mail(
        to: "support@example.com",
        subject: 'New Contact Form Submission',
      )
    else
      # Use @user_mailer.errors to inform the user of their mistake.
      render 'new'
    end
  end
end

Если у вас есть несколько форм, связанных с UserMailer, вы можете создать отдельные классы для проверки входных данных каждой формы, а затем передать их UserMailer. Скорее всего, вы все равно захотите проверки на UserMailer.

1 голос
/ 26 октября 2019

Вы можете использовать ActiveModel::Validations на вашем PORO так же, как это делает AR.


class MyFormObject
  include ActiveModel::Validations

  def initialize(options)
    options.each_pair{|k,v|
      self.send(:"#{k}=", v) if respond_to?(:"#{k}=")
    }
  end

  attr_accessor :name, :email, :phone, :message

  validates :name, presence: true
  # and so on...

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