Mailer question -- Order Confirmation

Hi,

I have a method “process” to process an order. It works good. I then
added an actionmailer to send an email confirmation when the order is
processed. I believed I followed the example from AWDWR 2nd ed.
Anyhow, I how get an error in regards to this addition:

NameError (undefined local variable or method order' for #<Order: 0x34fbcdc>): /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/ active_record/base.rb:1860:inmethod_missing’
.//app/models/order.rb:38:in process' .//app/controllers/cart_controller.rb:103:inplace_order’

My order.rb model line 38 says:
OrderMailer.confirm(order)

My order)mailer.rb has:
def confirm(order)
@subject = ‘Company Order Confirmation’
@body[“order”] = order
@recipients = order.email
@bcc = ‘orders@…’
@from = ‘orders@…’
@sent_on = Time.now
@headers[“Organization”] = “Company”
end

Would anyone know what the problem is?

TIA,
Elle

On 5 Dec 2007, at 05:26, elle wrote:

/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/
active_record/base.rb:1860:in method_missing' .//app/models/order.rb:38:inprocess’
.//app/controllers/cart_controller.rb:103:in `place_order’

My order.rb model line 38 says:
OrderMailer.confirm(order)

The error message suggests that you are calling
OrderMailer.confirm(order) from an instance of order. Assuming that it
is trying to send the confirmation email for itself, that should
probably be
OrderMailer.confirm(self)

Fred

What you say sounds very logical but I still get an error.

My process method in the order.rb model says:
35 def process
36 result = true
37 …
38 OrderMailer.confirm(self)
39 self.status = ‘processed’
40 save!
41 result
42 end

The place_order method in the cart_controller.rb:
94 def place_order
95 @page_title = “Checkout”
96 @order = Order.new(params[:order])
97 @order.customer_ip = request.remote_ip
98 @order.customer_id = @customer.id
99 @order.discount = @customer.discount
100 populate_order
101
102 if @order.save
103 if @order.process
104 flash[:notice] = ‘Your order has been submitted, and will be
processed immediately.’
105 session[:order_id] = @order.id
106 # Empty the cart
107 @cart.cart_items.destroy_all
108 redirect_to :action => ‘thank_you’
109 else
110 flash[:notice] = “Error while placing order.
‘#{@order.error_message}’”
111 render :action => ‘view_cart’
112 end
113 else
114 render :action => ‘checkout’
115 end
116 end

And the error message is:
NoMethodError in CartController#place_order
undefined method confirm' for OrderMailer:Class /usr/local/lib/ruby/gems/1.8/gems/actionmailer-1.3.3/lib/action_mailer/ base.rb:335:in method_missing’
app/models/order.rb:38:in process' app/controllers/cart_controller.rb:103:in place_order’

Any ideas??

Thanks
Elle

On Dec 5, 6:40 pm, Frederick C. [email protected]

Thanks Fred. I originally had it as:
OrderMailer.create_confirm(order)
and it gave me an error of undefined method. Once I changed it to
self, no more problems.

Cheers,
Elle

On Dec 5, 8:43 pm, Frederick C. [email protected]

On 5 Dec 2007, at 09:19, elle wrote:

app/controllers/cart_controller.rb:103:in `place_order’

Any ideas??

That was me being half awake. If you checkAWDR, you’ll see that you
either need to do
OrderMailer.create_confirm(self) to create an email (but not send it)
or
OrderMailer.deliver_confirm(self) to create and send an email

Fred

I still have another question. So, now I don’t get an error but I also
don’t get an email for order confirmation.
…but… I do get an email when a user fills out a contact form. Any
ideas why the email is not getting sent?

I’m not even sure what code to send to check where the problem is.

Elle

Thank you Fred. Works like a charm.

Elle

On Dec 7, 8:35 pm, Frederick C. [email protected]

On 7 Dec 2007, at 09:17, elle wrote:

I still have another question. So, now I don’t get an error but I also
don’t get an email for order confirmation.
…but… I do get an email when a user fills out a contact form. Any
ideas why the email is not getting sent?

I’m not even sure what code to send to check where the problem is.

create_confirm doesn’t send email: it creates a TMail::Mail object
which you can then send. If you just want to send the email you should
use deliver_confirm instead of create_confirm

Fred