Rails mailer 填充模板时未定义局部变量

Rails mailer Undefined local variable when filling template

我是 Rails 上 ruby 的新手,非常感谢您的帮助!

我正在尝试在创建 post 后通过 post 中的信息向用户发送电子邮件。创建 post 后,我可以向用户发送电子邮件,但我无法将 post 的信息添加到邮件模板中。如果我尝试在电子邮件模板中使用 posts 变量,Rails returns "undefined local variable or method `micropost' for #<#:0x007fedf274d348>".

如果有人可以帮助我?

这是我的邮件:

    class Bicimensajeros < ApplicationMailer

    def post_email(usuario)
    @usuario = usuario

    mail(:from => "#{usuario.nombre} <#{usuario.email}>", :to => "#{usuario.nombre} <#{usuario.email}>", :bcc => "mail@gmail.com",  :subject => "Tu bicimensajero va en camino")

   end

end

这是邮件视图:

<h2>Recibimos tu pedido y un bicimensajero va en camino</h2>

<p>Hola, <%= @usuario.nombre %>:</p>

<p>
¡Recibimos tu pedido con éxito!

<span class="content"><strong>Recoleccion:</strong> <%= micropost.pickup %></span>
<span class="content"><strong>Entrega:</strong> <%= micropost.dropoff %></span>

</p>

<p>Estamos en camino y recibirás una notificación por mail cuando tu envío haya sido completado.</p>
<p>Cualquier duda, estamos disponible en el chat de atención a clientes dentro de <a href="https//bicimensajero.com">bicimensajero.com</a></p>
<p>Por whatsapp al</p>

<p>Tu envío está asegurado.</p>

<p>Bicimensajero México</p>

这是微型post型号:

class Micropost < ActiveRecord::Base
  belongs_to :usuario
  after_create :send_email
  default_scope -> { order(created_at: :desc) }
  validates :usuario_id, presence: true
  validates :pickup, presence: true
  validates :dropoff, presence: true
  validates :precio, presence: true
  validates :telefono, presence: true
  validates :notas, presence: true
end

def send_email
   Bicimensajeros.post_email(self.usuario).deliver
 end

还有我的微型post控制器:

class MicropostsController < ApplicationController
  before_action :logged_in_usuario, only: [:create, :destroy]

  def create
    @micropost = current_usuario.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Bicimensajero en camino!"
      redirect_to root_url
    else
      @feed_items = []
      flash[:warning] = "No se solicito nada :("
      render 'estaticas/home'
    end
  end

  def destroy
  end

  private

    def micropost_params
      params.require(:micropost).permit(:pickup, :dropoff, :telefono, :precio, :notas)
    end
end

您没有将 micropost 传递给您的邮件程序,但它用于您的电子邮件视图。您需要在 post_email 方法中将一个单独的变量 micropost 传递给您的邮件程序。

在您的邮件程序中,您应该像 @usuario 一样分配一个实例变量 @micropost。然后,在您看来,您需要将 micropost 更改为 @micropost

您的问题是您的操作邮件程序模板没有引用名为 'micropost' 的对象。在邮件程序方法及其相应模板之间共享对象的最简单方法是使用实​​例变量,就像您当前正在使用“@usuario”实例变量一样。您应该对“@micropost”实例变量执行相同的操作,但是您的邮件程序方法需要知道将其设置为什么。因此,为 post_email 方法提供第二个参数,允许您传入 Micropost 对象。将您的邮件程序更改为如下所示:

class Bicimensajeros < ApplicationMailer
  def post_email( usuario, micropost )
    @usuario = usuario
    @micropost = micropost

    mail(:from => "#{usuario.nombre} <#{usuario.email}>", :to => "#{usuario.nombre} <#{usuario.email}>", :bcc => "mail@gmail.com",  :subject => "Tu bicimensajero va en camino")
  end
end

您还需要更新模板以使用实例变量“@micropost”而不是未知的局部变量'micropost':

<h2>Recibimos tu pedido y un bicimensajero va en camino</h2>

<p>Hola, <%= @usuario.nombre %>:</p>

<p>
¡Recibimos tu pedido con éxito!

<span class="content"><strong>Recoleccion:</strong> <%= @micropost.pickup %></span>
<span class="content"><strong>Entrega:</strong> <%= @micropost.dropoff %></span>

</p>

<p>Estamos en camino y recibirás una notificación por mail cuando tu envío haya sido completado.</p>
<p>Cualquier duda, estamos disponible en el chat de atención a clientes dentro de <a href="https//bicimensajero.com">bicimensajero.com</a></p>
<p>Por whatsapp al</p>

<p>Tu envío está asegurado.</p>

<p>Bicimensajero México</p>

最后,您需要确保调用邮件程序的 post_email 方法的代码将 Micropost 对象作为其第二个参数传递。这是通过传递 'self' 作为第二个参数在您的 Micropost 模型中完成的:

class Micropost < ActiveRecord::Base
  belongs_to :usuario
  after_create :send_email
  default_scope -> { order(created_at: :desc) }
  validates :usuario_id, presence: true
  validates :pickup, presence: true
  validates :dropoff, presence: true
  validates :precio, presence: true
  validates :telefono, presence: true
  validates :notas, presence: true

  def send_email
    Bicimensajeros.post_email( self.usuario, self ).deliver
  end
end

希望对您有所帮助!