生成预定的时事通讯

创建新闻稿模型:

  rails g model Newsletter name:string email:string

  subl app/models/newsletter.rb

  validates :name, presence: true
  validates :email, presence: true

创建新闻稿控制器:

  rails g controller Newsletters create
  
  class NewslettersController < ApplicationController
    skip_before_action :authenticate_user!
    before_action :set_newsletter, only: [:destroy]

    def create
      @newsletter = Newsletter.create(newsletter_params)
      if @newsletter.save
        redirect_to blog_index_path
      else
        redirect_to root_path
      end
    end

    private

      def set_newsletter
        @newsletter = Newsletter.find(params[:id])
      end

      def newsletter_params
        params.require(:newsletter).permit(:name, :email)
      end

  end

之后,将 create.html.erb 视图更改为 nex 名称。我们将此文件转换为将存储在页脚内的部分视图。名称为 _form.html.erb 。 **** ****

更改名称文件: 至:
app / views / newsletters / create.html.erb app / views / newsletters / _form.html.erb

之后设置路线:

  subl app/config/routes.rb
    
  resources :newsletters

稍后,我们需要设置用于保存每封邮件的表单:

  subl app/views/newsletters/_form.html.erb

  <%= form_for (Newsletter.new) do |f| %>
    <div class="col-md-12" style="margin: 0 auto; padding: 0;">
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :name, class: 'form-control', placeholder:'Nombre' %>
      </div>
      <div class="col-md-6" style="padding: 0;">
        <%= f.text_field :email, class: 'form-control', placeholder:'Email' %>
      </div>
    </div>
    <div class="col-md-12" style="margin: 0 auto; padding:0;">
      <%= f.submit class:"col-md-12 tran3s s-color-bg hvr-shutter-out-horizontal", style:'border: none; color: white; cursor: pointer; margin: 0.5em auto; padding: 0.75em; width: 100%;' %>
    </div>
  <% end %>

然后,在页脚上插入:

  subl app/views/layouts/_footer.html.erb

  <%= render 'newsletters/form' %>

现在,安装 - letter_opener - 可以在默认浏览器中预览电子邮件而不是发送它。这意味着你无需在开发环境中设置电子邮件传递,也不必担心将测试电子邮件意外发送到其他人的地址。

首先将 gem 添加到开发环境并运行 bundle 命令进行安装。

  subl your_project/Gemfile

  gem "letter_opener", :group => :development

然后在开发环境中设置交付方法:

  subl your_project/app/config/environments/development.rb

  config.action_mailer.delivery_method = :letter_opener

现在,创建一个邮件程序结构来管理我们将要工作的整个邮件程序。在终端

  rails generate mailer UserMailer newsletter_mailer

UserMailer 中,我们必须创建一个名为 Newsletter Mailer 的方法,该方法将被创建为包含最新博客帖子中的内部,并将通过 rake 动作触发。我们假设你之前创建了一个博客结构。

subl your_project/app/mailers/user_mailer.rb

class UserMailer 'your_gmail_account@gmail.com'

  
  def newsletter_mailer
    @newsletter = Newsletter.all
    @post = Post.last(3)
    emails = @newsletter.collect(&:email).join(", ")
    mail(to: emails, subject: "Hi, this is a test mail.")
  end
  
end

之后,创建 Mailer 模板

subl your_project/app/views/user_mailer/newsletter_mailer.html.erb

<p> Dear Followers: </p>
<p> Those are the lastest entries to our blog. We invite you to read and share everything we did on this week. </p>

<br/>
<table>
<% @post.each do |post| %>
  <%#= link_to blog_url(post) do %>
      <tr style="display:flex; float:left; clear:both;">
        <td style="display:flex; float:left; clear:both; height: 80px; width: 100px;">
          <% if post.cover_image.present? %>
            <%= image_tag post.cover_image.fullsize.url, class:"principal-home-image-slider" %>
          <%# else %>
            <%#= image_tag 'http://your_site_project.com' + post.cover_video, class:"principal-home-image-slider" %>
            <%#= raw(video_embed(post.cover_video)) %>
          <% end %>
        </td>
        <td>
          <h3>
            <%= link_to post.title, :controller => "blog", :action => "show", :only_path => false, :id => post.id %>
          </h3>
          <p><%= post.subtitle %></p>
        </td>
        <td style="display:flex; float:left; clear:both;">
           
        </td>
      </tr>
  <%# end %>
<% end %>
</table>

由于我们希望将电子邮件作为单独的进程发送,因此我们创建一个 Rake 任务来启动电子邮件。将名为 email_tasks.rake 的新文件添加到 Rails 应用程序的 lib / tasks 目录中:

touch lib/taks/email_tasks.rake

desc 'weekly newsletter email'
task weekly_newsletter_email: :environment do
  UserMailer.newsletter_mailer.deliver!
end

send_digest_email ::环境意味着在运行任务之前加载 Rails 环境,因此你可以访问任务中的应用程序类(如 UserMailer)。

现在,运行命令 rake -T 将列出新创建的 Rake 任务。通过运行任务并检查是否发送电子邮件来测试一切是否正常。

要测试邮件程序方法是否有效,请运行 rake 命令:

  rake weekly_newsletter_email

此时,我们有一个工作 rake 任务,可以使用 crontab 进行调度。因此,我们将安装 Whenever Gem ,用于为编写和部署 cron 作业提供清晰的语法。

subl your_project/Gemfile
  
  gem 'whenever', require: false

之后,运行下一个命令为你创建初始 config / schedule.rb 文件(只要配置文件夹已存在于你的项目中)。

  wheneverize .

  [add] writing `./config/schedule.rb'
  [done] wheneverized!

现在,在计划文件中,我们必须创建我们的 CRON JOB 并调用邮件程序方法来确定 CRON JOB 以在没有帮助的情况下在选定的时间范围内运行某些任务。你可以使用此链接中说明的不同类型的语法。

subl your_project/config/schedule.rb

every 1.day, :at => '4:30 am' do
  rake 'weekly_newsletter_email'
end

Cron 作业基本语法

Cron 乔布斯随时待命

现在为了测试 Cron Job 是否已成功创建,我们可以使用下一个命令来读取终端,我们在 CRON SYNTAX 中的预定作业:

your_project your_mac_user$ whenever

30 4 * * * /bin/bash -l -c 'cd /Users/your_mac_user/Desktop/your_project && RAILS_ENV=production bundle exec rake weekly_newsletter_email --silent'

现在,要在开发环境中运行测试,最好在 application.rb 主体文件上设置下一行,让应用程序知道它将使用的模型在哪里。

  subl your_project/config/application.rb

  config.action_mailer.default_url_options = { :host => "http://localhost:3000/" }

现在让 Capistrano V3 将新的 Cron Job 保存在服务器内,触发器将启动此任务的执行,我们必须添加下一个要求:

  subl your_project/Capfile

  require 'whenever/capistrano'

并在部署文件中插入 CRON JOB 将使用的有关环境应用程序名称的标识符。

subl your_project/config/deploy.rb

set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:rails_env)}" }

准备好了,在保存每个文件的更改后,运行 capistrano deploy 命令:

  cap production deploy

现在你的 JOB 被创建并且日历化以运行 Mailer 方法,这是我想要的,并且在我们设置这个文件的时间范围内。