Rails Mailer - 无法从 Mailer 视图访问实例变量

Posted

技术标签:

【中文标题】Rails Mailer - 无法从 Mailer 视图访问实例变量【英文标题】:Rails Mailer - Can't access instance variable from Mailer View 【发布时间】:2017-08-22 07:06:11 【问题描述】:

我有一个 Rails 邮件程序,目前只要用户回复其他用户的评论,它就会成功发送电子邮件。 (电子邮件发送给被回复的人)。我正在尝试在电子邮件正文中添加一些动态内容,例如回复者的用户名和该用户的评论本身。我不确定如何在 new_reply.html.erb 视图中获取该特定评论,以便它在我正在发送的电子邮件中正确显示...我的代码如下:

views/comment_mailer/new_reply.html.erb(电子邮件内容)

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <table >

        <h2 style="color: #428bca">You have a new reply.</h2>
            <p>Someone replied with the following comment...</p>

      <p><%= comment.body %></p>

            <p>To reply back, login to the app...</p>

        </table>
  </body>
</html>

views/cmets/_comment.html.erb(应用中的实际评论视图)

<div class="well">
  <p class="text-muted">Added on
    <%= l(comment.created_at, format: '%B, %d %Y %H:%M:%S') %></p>

  <blockquote>
    <p><%= comment.body %></p>
        <p><%= link_to 'reply', new_comment_path(comment.id) %></p>
  </blockquote>
</div>

mailers/comment_mailer.rb(我的评论邮件)

class CommentMailer < ApplicationMailer
    default from: "notifications@app.com"

    def new_reply(parent_comment)
    owner = parent_comment.owner
        mail(to: owner.email, subject: 'New reply to one of your comments')
    end
end

controllers/model_cmets_controller.rb(这些 cmets 的控制器)

def create
    @taskrelationship = commentable_type.constantize.find(commentable_id)
    @project = @taskrelationship.taskproject
    @new_comment = Comment.build_from(@taskrelationship, current_user.id, body)
    if @new_comment.save

      # create the notification
      (@taskrelationship.taskproject.followers.uniq - [current_user]).each do |user|
        Notification.create(recipient: user, actor: current_user, action: "posted", notifiable: @new_comment)
      end

      make_child_comment
    end
    render 'projects/show_project_task_comments', layout: false
  end

private

def make_child_comment
  return if comment_id.blank?

  parent_comment = Comment.find comment_id
  @new_comment.move_to_child_of(parent_comment)
  CommentMailer.new_reply(parent_comment).deliver
end

【问题讨论】:

【参考方案1】:

在邮件程序的new_reply 方法中声明一个实例变量@comment,它引用您要使用的评论。

然后在模板中,使用@comment 引用即可。

【讨论】:

谢谢...所以基本上只是@comment = Comment.last 我试过了,然后在模板中做了

但那不起作用。抱歉,我有点累了……知道我错过了一些愚蠢的东西。
忽略...我只是将它放在“邮件”行之后,而它应该在该行之前。感谢您的帮助。 欢迎,希望对您有所帮助

以上是关于Rails Mailer - 无法从 Mailer 视图访问实例变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 的 Mailer 视图中获取格式

在 Rails 3.1 中为 Mailer 和 View 提供自定义助手

Rails 4.1 Mailer预览和设计自定义电子邮件

用于 webmail 的 rails 4 action mailer 设置 (SMTP)

Rails Action Mailer Document

Rails 5 mailer Net::SMTPFatalError 发送电子邮件时