如何创建"通过电子邮件发送此简报"按钮向所有用户发送简报(Rails)

时间:2015-07-07 00:10:54

标签: ruby-on-rails attributes actionmailer sendgrid newsletter

  

编辑:解决了,请查看下面的答案。

因此,我创建了一个名为newsletter的脚手架,网站所有者可以创建,编辑,销毁等。当他们对该新闻稿感到满意时,他们就能够发送通过按下将调用NewslettersController#send的按钮来解决问题。当我制作邮件和时事通讯用于测试目的时,我最初的.deliver_now位位于NewslettersController#create下。但是,当我尝试将其移至send方法时,突然出现在NewslettersController#indexnew等处。我收到错误消息,说明了梅勒的观点无法访问简报的属性。为什么会发生这种情况?为什么它只适用于create方法?

供参考,Mailer名为Monthly,脚手架为Newsletter

错误:

NoMethodError in Newsletters#index
undefined method `subject' for nil:NilClass

  <body>
    <h1>Hello</h1>
    <p><%= @newsletter.subject %></p>
    <p><%= @newsletter.body %></p>
    <p><%= @newsletter.link %></p>
  </body>

NewslettersController

  def send(monthly)
    Monthly.monthly(@newsletter).deliver_now
  end

monthly.html.erb(邮件的观点)

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Hello</h1>
    <p><%= @newsletter.subject %></p>
    <p><%= @newsletter.body %></p>
    <p><%= @newsletter.link %></p>
  </body>
</html>

相关日志:

Started GET "/newsletters" for 127.0.0.1 at 2015-07-06 20:08:04 -0400
Started GET "/newsletters" for 127.0.0.1 at 2015-07-06 20:08:04 -0400
Processing by NewslettersController#index as HTML
Processing by NewslettersController#index as HTML
   (0.2ms)  SELECT "users"."email" FROM "users"
   (0.2ms)  SELECT "users"."email" FROM "users"
  Rendered monthly/monthly.html.erb within layouts/mailer (1.2ms)
  Rendered monthly/monthly.html.erb within layouts/mailer (1.2ms)

Monthly#monthly: processed outbound mail in 8.3ms

Monthly#monthly: processed outbound mail in 8.3ms
Completed 500 Internal Server Error in 14ms (ActiveRecord: 0.9ms)
Completed 500 Internal Server Error in 14ms (ActiveRecord: 0.9ms)

ActionView::Template::Error (undefined method `subject' for nil:NilClass):
     5:   </head>
     6:   <body>
     7:     <h1>Hello</h1>
     8:     <p><%= @newsletter.subject %></p>
     9:     <p><%= @newsletter.body %></p>
    10:     <p><%= @newsletter.link %></p>
    11:   </body>
  app/views/monthly/monthly.html.erb:8:in `_app_views_monthly_monthly_html_erb___3456442674425673730_70162508652140'
  app/mailers/monthly.rb:4:in `monthly'
  app/controllers/newsletters_controller.rb:8:in `send'



ActionView::Template::Error (undefined method `subject' for nil:NilClass):
     5:   </head>
     6:   <body>
     7:     <h1>Hello</h1>
     8:     <p><%= @newsletter.subject %></p>
     9:     <p><%= @newsletter.body %></p>
    10:     <p><%= @newsletter.link %></p>
    11:   </body>
  app/views/monthly/monthly.html.erb:8:in `_app_views_monthly_monthly_html_erb___3456442674425673730_70162508652140'
  app/mailers/monthly.rb:4:in `monthly'
  app/controllers/newsletters_controller.rb:8:in `send'

如果我遗漏了一些信息,请告诉我

编辑:已添加monthly.rb

class Monthly < ApplicationMailer
    def monthly(newsletter)
        @newsletter = newsletter
        mail to: User.pluck(:email)

    end
end

编辑2:添加了before_action :set_newsletter

before_action :set_newsletter, only: [:send, :show, :edit, :update, :destroy]
def set_newsletter
  @newsletter = Newsletter.find(params[:id])
end
  

编辑3:新问题。我不再有索引或show方法的错误,但在尝试发送时遇到与以前相同的错误   通讯。以下是代码,但请注意,名称已更改   为了更加不言自明。

错误:

undefined method `subject' for nil:NilClass

<body>
    <h1>Hello</h1>
    <p><%= @newsletter.subject %></p>
    <p><%= @newsletter.body %></p>
    <p><%= @newsletter.link %></p>
</body>

NewslettersController#send_newsletter

  def send_newsletter
    Monthly_Mailer.monthly(@newsletter).deliver_now
    flash[:notice] = "Newsletter has been sent."
    redirect_to newsletter_path(@newsletter.id)
  end

路线

get :send_newsletter, to: 'newsletters#send_newsletter', as: :send_newsletter

Monthly_Mailer.rb

class Monthly_Mailer < ApplicationMailer
    def monthly(newsletter)
        @newsletter = newsletter
        mail to: User.pluck(:email)
    end
end

按钮发送时事通讯show.html.erb

<%= link_to "Send Newsletter by email", :controller => "newsletters", :action => "send_newsletter", :id => @newsletter.id %>

相关日志条目显示正确传递了newsletter.id

Processing by NewslettersController#send_newsletter as HTML
  Parameters: {"id"=>"1"}

1 个答案:

答案 0 :(得分:1)

  

如何创建&#34;通过电子邮件发送此简报&#34;

这将允许您的用户像任何帖子一样创建,编辑和删除简报,然后在他们满意后将其发送出去。

这假设您已经设置了environment个文件,并且可以通过您的Rails应用程序成功发送电子邮件。

注意 应该注意的是,您需要为生产改变一些东西。例如,向所有用户发送简报是不好的做法。您应该考虑创建一个布尔值,他们可以检查他们是否希望收到简报,然后将其发送给所有这些用户。

步骤:

  1. 为您将使用的时事通讯和邮件程序创建脚手架。
  2. 为您的简报类创建一个自定义方法,当您按下&#34;通过电子邮件发送此简报时,您将调用该方法&#34;按钮。
  3. 修改邮件程序以创建将您的简报发送给所有用户的操作。
  4. 创建邮件程序的视图。
  5. 添加您用于&#34;发送此简报&#34;的路线。按钮。
  6. 添加简报的show.html.erb链接,以便您的客户发送简报。
  7. 步骤1.生成脚手架和邮件

    我假设你自己可以完成大部分工作。

    请务必为您的邮件提供与您的脚手架不同的名称,否则您将遇到一些冲突。我为我的脚手架选择了Newsletter,为我的邮件选择了Monthly

    $ rails g scaffold Newsletter subject:string body:text link:string
    
    $ rails g mailer Monthly
    

    步骤2.在NewslettersController

    中创建自定义方法

    接下来,创建一个方法,当您的客户想要发送简报时,可以调用该方法。另一种方法是将此代码附加到NewslettersController#create方法,但在发送之前无法修改新闻稿。

      def send_newsletter
    
    #Let's take a close look at this line below
        Monthly_Mailer.monthly(@newsletter).deliver_now
    
        flash[:notice] = "Newsletter has been sent."
        redirect_to newsletter_path(@newsletter.id)
      end
    

    备注: Monthly_Mailer引用了/app/mailers中生成邮件时创建的文件的名称。 monthly引用了我们将在Monthly_Mailer

    内发送邮件的方法

    第3步:修改邮件

    class Monthly_Mailer < ApplicationMailer
        def monthly(newsletter)
            @newsletter = newsletter
            mail to: User.pluck(:email)
        end
    end
    

    User.pluck(:email)更改为您自己的邮件列表,可能会使用介绍说明中的建议。截至目前,这段代码将邮件发送给所有用户,即使他们不想要新闻通讯。这与电子邮件中没有Unsubscribe链接的事实相结合意味着它是不道德的,可能违反了法律。

    第4步:创建邮件程序的视图

    生成邮件时,它应该在monthly_mailer目录中创建一个文件夹/app/views/。根据您用于生成器的选项,它甚至可能创建了monthly.html.erbmonthly.text.erb。如果没有,请立即创建。你自己必须为HTML文件做样式,但我已经包含了一些基本的东西。 TEXT文件将用作HTML文件的替代文件,不包含任何HTML样式。我强烈建议您同时包含HTML和TEXT版本。

    您的monthly.html.erb文件可能如下所示:

    <!DOCTYPE html>
    <html>
      <head>
        <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
      </head>
      <body>
        <h1>Hello</h1>
        <p><%= @newsletter.subject %></p>
        <p><%= @newsletter.body %></p>
        <p><%= @newsletter.link %></p>
      </body>
    </html>
    

    对于monthly.text.erb,想象与HTML文件相同,但没有任何HTML。

    第5步:添加将用于&#34;通过电子邮件发送此简报的路线。

    get :send_newsletter, to: 'newsletters#send_newsletter', as: :send_newsletter
    

    newsletters#send_newsletter引用了我们在NewslettersController

    中制作的自定义方法

    第6步:添加简报的show.html.erb

    中的链接
    <%= link_to "Send Newsletter by email", :controller => "newsletters", :action => "send_newsletter", :id => @newsletter %>
    

    STEP 7

    没有第7步。享受。请随时提交更正或建议。我知道这不是完美的,但它确实有效。