Rails сравнивает почтовый индекс на основе пользовательского ввода с базой данных, а затем отправляет его сотруднику - PullRequest
0 голосов
/ 14 января 2019

У нас есть форма клиента, которая не хранит данные, но имеет форму, которая затем передает данные контакту. Что я хотел бы сделать, так это, когда клиент вводит свои данные, это взять почтовый индекс из формы, сравнить его со всеми почтовыми индексами и, если он совпадает, отправить свою контактную информацию менеджеру в своем регионе.

В двух словах Билл вводит 10001 и соответствует дб Zipcodes с идентификатором региона 3. Таким образом, менеджер региона 3 получает электронное письмо.

Для моделей у меня есть:

Zipcode
belongs_to :region

Region
has_many :zipcodes, dependent: :destroy

Contact
include ActiveModel::Model
attr_accessor :first_name, :last_name, :company, :region, :email, :message_for_mailer, :inquiry, :address, :city, :state, :zipcode

В моем ContactsController у меня есть следующее для создания:

 def create
  @contact = Contact.new(contact_params)
  @contact.valid?
  if captcha?
   ContactMailer.contact_request(@contact).deliver if @contact.valid?
  else
   @contact.errors.add(:base, 'Please verify you are human')
  end
  respond_with @contact
 end

Моей мыслью было следующее:

def create
 @zipcode = Zipcode.all
 @contact = Contact.new(contact_params)
 @contact.valid?
 if captcha?
   if @contact.zipcode == @zipcode.zipcode
     ContactMailer.custom_request(@contact).deliver if @contact.valid?
   else
     ContactMailer.basic_request(@contact).deliver if @contact.valid?
   end
 else
   @contact.errors.add(:base, 'Please verify you are human')
 end
 respond_with @contact
end

Но я почти уверен, что это не сработает, поскольку я на самом деле не сравниваю с БД. Итак, как мне перебрать таблицу Zipcode с результатами создаваемых данных?

1 Ответ

0 голосов
/ 14 января 2019

Я бы использовал ActiveJob для создания задания, которое можно выполнить после отправки ответа. Это делает приложение более быстрым, поскольку пользователю не нужно ждать отправки электронного письма и освобождает ваши веб-потоки.

class ContactNotifierJob < ApplicationJob
  queue_as :default 
  def perform(contact)
    @zipcode = ZipCode.find_by(zipcode: contact.zipcode)
    @manager = @zipcode.try(:region).try(:manager)
    if @manager
      ContactMailer.notify_manager(@contact, @manager).deliver
    else
      ContactMailer.do_something_else(@contact).deliver
    end
  end
end

Затем вы можете просто спулинговать работу с вашего контроллера:

def create
  @contact = Contact.new(contact_params)
  @contact.errors.add(:base, 'Please verify you are human') unless captcha? 
  if @contact.save
    ContactNotifierJob.perform_later(@contact)
  end
  respond_with @contact
end

Это будет выполнено, как только система очередей освободится.

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