如何在Ruby on Rails中基于新发布的作业广告发送电子邮件通知

时间:2016-11-11 08:53:58

标签: ruby-on-rails ruby-on-rails-4

我正在为一个招聘委员会工作,需要根据每12小时内发布的工作向订阅者发送电子邮件通知。

send_post_email.html.erb(梅勒模板)

<!DOCTYPE html>
<html>
<head>
  <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>

<body>
  <div>
    <h3> Hi, new job just posted on FarFlungJobs.com! </h3>
  </div>

  <section>
    <p>Fresh Job</p>
    <hr>
    <p>
        <%= Job.select do |job| %>
            <section class="container">
              <div class="row jobs">
                <div class="col-md-4" style="font-size: 20px;"><strong><%= job.company_name %></strong></div>
                <div class="col-md-4" style="font-size: 20px;"><%= link_to(job.title, job) %></div>
                <div class="col-md-4 text-right" style="font-size: 20px; float: left;"><%= job.created_at.strftime('%d %B %y') %></div>
              </div>
              <%= render 'shared/two_breaks'%>
            </section>
        <% end %>
    </p>

    <p>Thanks for subscribing to FarFlungJobs once again. <%=  jobs_url %> </p>

  </section>
</body>
</html>

job_notifier.rb

class JobNotifier < ApplicationMailer
  def send_post_email(job)
    @user = User.where(:email => true).all
    emails = @user.collect(&:email).join("#{','}")
    @jobs = job
    @job = job
    mail(:to => emails, :bcc => User.pluck(:email).uniq, :subject => 'New job posted on FarFlungJobs')
  end
end

jobs_controller.rb

class JobsController < ApplicationController
 def update
    @job = Job.find(params[:id])
    if !(@job.paid?)
      @job.update_attributes(stripeEmail: params[:stripeEmail], payola_sale_guid: params[:payola_sale_guid])
        if @job.paid?
          JobNotifier.send_post_email(@job).deliver_now
        end
      @job.update(job_params) if params.has_key?(:job)
      redirect_to  preview_job_path(@job) #show_job_path
    else
      render :edit
    end
  end
end

job.rb(模型)

class Job < ActiveRecord::Base
  def self.jobs_posted_12hrs_ago
    where.not('stripeEmail' => nil).where.not('payola_sale_guid' => nil).where('created_at > ?', 18.hours.ago)
  end
end

注意:这会发送电子邮件,但会在数据库中发送所有已发布的作业,这是我不想要的。

  

我想做的是将过去12小时内新发布的作业发送给电子邮件订阅者。

1 个答案:

答案 0 :(得分:2)

在我看来,你应该有一个工作(ActiveJob)使用你在“工作”模型中定义的范围,并将其设置为每天重复,你必须使用像sidekiq或任何其他,信息的作业服务器here

这份工作应该是这样的。

class NewJobsMailer < ApplicationJob
  queue_as :default

  def perform(*guests)
    jobs = Job.jobs_posted_12hrs_ago
    jobs.each do
     JobNotifier.send_post_email(@job).deliver_now
    end
  end
end

它不完美,但我希望你能用它作为指导。