编辑:解决了,请查看下面的答案。
因此,我创建了一个名为newsletter
的脚手架,网站所有者可以创建,编辑,销毁等。当他们对该新闻稿感到满意时,他们就能够发送通过按下将调用NewslettersController#send
的按钮来解决问题。当我制作邮件和时事通讯用于测试目的时,我最初的.deliver_now
位位于NewslettersController#create
下。但是,当我尝试将其移至send
方法时,突然出现在NewslettersController#index
,new
等处。我收到错误消息,说明了梅勒的观点无法访问简报的属性。为什么会发生这种情况?为什么它只适用于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"}
答案 0 :(得分:1)
如何创建&#34;通过电子邮件发送此简报&#34;
这将允许您的用户像任何帖子一样创建,编辑和删除简报,然后在他们满意后将其发送出去。
这假设您已经设置了environment
个文件,并且可以通过您的Rails应用程序成功发送电子邮件。
注意强> 应该注意的是,您需要为生产改变一些东西。例如,向所有用户发送简报是不好的做法。您应该考虑创建一个布尔值,他们可以检查他们是否希望收到简报,然后将其发送给所有这些用户。
步骤:
show.html.erb
链接,以便您的客户发送简报。步骤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.erb
和monthly.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步。享受。请随时提交更正或建议。我知道这不是完美的,但它确实有效。