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
希望对您有所帮助!
我是 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
希望对您有所帮助!