如何在Rails中将多个对象传递给邮件发送器/邮件内容

3

当用户发布一篇文章(sub_opp)时,我会向该用户发送电子邮件。但是,我希望在邮件中包括运动项目(sub_opp模型中的列)。在下面的示例中,当命中邮件程序时,sub_opp出现未定义方法错误。

创建sub_opp的控制器

def create
@sub_opp = SubOpp.new(sub_opp_params)
respond_to do |format|
  if @sub_opp.save
    user = User.find_by_id(@sub_opp.user_id)
    sub_opp = @sub_opp
    UserMailer.posted_subopp_email(user, sub_opp).deliver
    .... continued

邮件发送控制器

  def posted_subopp_email(user, sub_opp)
    mail( :to => user.email,  :subject => 'You made a post!' )
  end

电子邮件视图
<!DOCTYPE html>
 <html>
  <head>
   <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h3>You posted to the sub feed!</h3>
    <p>You made a post.</p>
    <p><%= sub_opp.sport %></p>
  </body>
 </html>

为什么在这个例子中 <%= sub_opp.sport %> 不起作用?Sport 是 sub_opp 模型中的一列。谢谢。
1个回答

8

首先创建一个实例变量。实例变量将在您的邮件视图中可用。

将您的邮件程序视为MVC中的控制器。

def posted_subopp_email(user, sub_opp)
  @sub_opp = sub_opp
  @user = user
  mail( :to => user.email,  :subject => 'You made a post!' )
end

然后像在视图中一样访问它。
<body>
  <h3>You posted to the sub feed!</h3>
  <p>You made a post.</p>
  <p><%= @sub_opp.sport %></p>
</body>

这个有效。我不需要添加@user = user,但是我需要访问subopp。谢谢! - brad
实际上,您在当前视图中不需要@user。但是为什么要将其提供给posted_subopp_email呢?最好将其删除。 - mathieugagne
我确实需要它。我没有理解邮件程序中的实例变量是显示电子邮件中所需内容的概念。感谢您的帮助。 - brad
感谢您提供如此精彩的答案! - 0bserver07

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接