生成預定的時事通訊

建立新聞稿模型:

  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 方法,這是我想要的,並且在我們設定這個檔案的時間範圍內。