我想将一个方法从应用程序控制器传递给邮件程序,以便将购物车内容发送到电子邮件。
application_controller.rb中的方法:
def current_order
if session[:order_id].present?
Order.find(session[:order_id])
else
Order.new
end
end
邮件程序:
class CartMailer < ApplicationMailer
default from: "from@example.com"
def send_cart_contents
@order = current_order
mail(to: "to@example.com", subject: 'Order from the site')
end
end
观点:
Order from the site
<% @order.order_items.each do |oi| %>
<%= oi.product.name %>
<% end %>
我收到错误:未定义的本地变量或方法&#39; current_order&#39;。 我究竟做错了什么?谢谢。
更新
如果我将其作为参数传递:
# Preview all emails at http://localhost:3000/rails/mailers/cart_mailer
class CartMailerPreview < ActionMailer::Preview
def cart_mailer_preview
CartMailer.send_cart_contents(current_order)
end
end
我也得到了NameError。
更新2
CartMailerPreview无法访问current_order,因此要测试它只是传递带参数的id。当你正常使用时一切正常。
答案 0 :(得分:2)
CartMailer
无法看到current_order
中定义的application_controller.rb
。这是一件好事。
最佳做法是让send_cart_contents
方法接受订单,以便将其邮寄出去:
class CartMailer < ApplicationMailer
default from: "from@example.com"
def send_cart_contents(order)
@order = order
mail(to: "to@example.com", subject: 'Order from the site')
end
end
通过这种方式,您可以从后台作业邮寄出购物车,并将邮件与控制器隔离开来。依赖全球current_order
并不是一种好习惯。
答案 1 :(得分:0)
您应该将current_order作为参数传递给邮件程序。