Rails邮件填充模板时未定义的局部变量

时间:2015-07-31 01:55:35

标签: ruby-on-rails ruby email actionmailer

我对Rails上的ruby非常新,非常感谢你的帮助!!

我尝试使用帖子中的信息在创建帖子后向用户发送电子邮件。我可以在创建帖子后通过电子邮件发送给用户,但我无法将帖子的信息添加到邮件模板中。如果我尝试在电子邮件模板中使用posts变量,Rails将返回"未定义的局部变量或方法`micropost'对于#<#: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>

以下是微博模型:

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

我的微博控制器:

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

2 个答案:

答案 0 :(得分:1)

您的问题是您的动作邮件程序模板没有对名为“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对象作为其第二个参数传递。这是在您的Micropost模型中通过传递'self'作为第二个参数来完成的:

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

希望这有帮助!

答案 1 :(得分:0)

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

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