【发布时间】:2015-09-24 07:14:27
【问题描述】:
编辑:已解决,请在下面查看我的答案。
所以我创建了一个名为 newsletter 的脚手架,网站所有者将能够创建、编辑、销毁等。当他们对该时事通讯感到满意时,他们将能够通过按下按钮将其发送出去这将调用NewslettersController#send。当我为测试目的制作邮件和时事通讯时,我最初的 .deliver_now 位位于 NewslettersController#create 下。但是,当我尝试将其移至send 方法时,突然间在我的NewslettersController#index、new 等上。我收到一条错误消息,指出Mailer 的视图无法访问Newsletter 的属性。为什么会发生这种情况?为什么它只适用于 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:新问题。 我不再遇到 index 或 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"}
【问题讨论】:
-
在您的控制器中设置
@newsletter的代码在哪里?monthly方法是什么样的? -
@cschroed
@newsletter使用before_action :set_newsletterprivate方法设置,rails 使用该方法默认为所有 CRUD 操作设置@newsletter。我在编辑中添加了monthly.rb。感谢您的回复。 -
您能在此处包含
before_action、set_newsletter和操作代码吗?通常,像index这样的操作不会设置单个@newsletter,而是设置@newsletters的集合。 -
@cschroed
set_newsletter不会在index之前调用,仅在需要引用特定时事通讯的操作之前调用。检查EDIT 2的代码。如果我说它是在index之前调用的,我为错误传达道歉 -
您的日志显示
Processing by NewslettersController#index。index是调用NewslettersController#send然后调用Monthly.monthly的操作吗?
标签: ruby-on-rails attributes actionmailer sendgrid newsletter