Routing of result not clear in ActionMailer


#1

Dear all,

I am trying to understand the following behaviour of the ActionMailer
in Rails 2.

I have an emailer_controller.rb

class EmailerController < ApplicationController
def send_mail
Emailer::deliver_contact_email(params[:email])
end
end

I have a model emailer.rb

class Emailer < ActionMailer::Base
def contact_email(email_params, sent_at = Time.now)
@recipients = “removed_email_address@domain.invalid”
@from = email_params[:name] + " <" + email_params[:address] +
“>”
@subject = email_params[:subject]
@sent_on = sent_at
@body[“email_body”] = email_params[:body]
@body[“email_name”] = email_params[:name]
end
end

and I send from within a form

<%= form_tag :action=> “send_mail”, :controller=> “emailer” %>
… some details deleted here …

<%= %>

and I have a send_mail.html.erb template with some content (thanx for
your mail…)

In this setup I get an error: Missing template emailer/
contact_email.html.erb

When I add an empty template of that name, everything works nicely.

My question is: WHY do I need a template with the same name as a
method in the model? So far as I understand Ruby, I am expected to
have a template for the controller method - but why for the model.

And: If I put some content into that file it is not displayed.

So: What happens with the content in emailer/contact_email.html.erb ?

Thanx for helping out.


#2

On Oct 25, 6:30 pm, X removed_email_address@domain.invalid wrote:

In this setup I get an error: Missing template emailer/
contact_email.html.erb

When I add an empty template of that name, everything works nicely.

My question is: WHY do I need a template with the same name as a
method in the model? So far as I understand Ruby, I am expected to
have a template for the controller method - but why for the model.

Where do you thing the content for the email is coming from? Just as
actions in a controller are backed by template files so are methods in
an ActionMailer object.

And: If I put some content into that file it is not displayed.

So: What happens with the content in emailer/contact_email.html.erb ?

It should form the body of the email sent.

Fred


#3

It should form the body of the email sent.

Ah, okay. Great concept and actually I now realize all testmails were
empty…

But this just leads to the next problem: Shouldn’t I have access to
the variables set in the model? Sorry probably I am doing something
very stupid…

With both templates set to

We mail:
Recipients: <%= @recipients %>
From: <%= @from %>
Subject: <%= @subject %>
Sent on: <%= @sent_on %>

I just get the text and NO access to the model neither in the one nor
in the other file.


#4

Ok, solved the first subpart.

In contact_email.html.erb I do not have access to all variables of the
mode but only to
the contents of the hash @body. So this is working:

Body: <%= @email_body %>
Name: <%= @email_name %>

Still I am not sure how to solve this for send_mail.html.erb, but
probably a render function is missing here or not correct.


#5

On 25 Oct 2008, at 19:58, X wrote:

Ok, solved the first subpart.

In contact_email.html.erb I do not have access to all variables of the
mode but only to
the contents of the hash @body. So this is working:

Yup you got it.

Body: <%= @email_body %>
Name: <%= @email_name %>

Still I am not sure how to solve this for send_mail.html.erb, but
probably a render function is missing here or not correct.
What was the problem here?


#6

On 25 Oct 2008, at 20:19, X wrote:

The same problem (but it seems to have a different answer).

In contact_email.html.erb I did not get access to variable @recipients
but only to variable @email_body, looks like this is rendered off the
hash table @body. But in send_mail.html.erb neither the one nor the
other works. I would, however, want to present the user with a copy of
the mail he sent via the form in the browser, so I need to know how
the send_mail.html.erb template can access the email body.

the send_mail template knows absolutely nothing of what happened in
the mailer. By the time send_mail.html.erb is rendered the
actionmailer object with those instance variables probably doesn’t
even exist anymore.
Given that those values were just things pulled out of the params hash
the send_mail view/its associated controller action can just do the
same thing.

Fred


#7

Of course! :slight_smile:

Thanx for the real quick support !!


#8

Yup you got it.

Thanx for your quick reply ! Great service :slight_smile:

Still I am not sure how to solve this for send_mail.html.erb, but
probably a render function is missing here or not correct.

What was the problem here?

The same problem (but it seems to have a different answer).

In contact_email.html.erb I did not get access to variable @recipients
but only to variable @email_body, looks like this is rendered off the
hash table @body. But in send_mail.html.erb neither the one nor the
other works. I would, however, want to present the user with a copy of
the mail he sent via the form in the browser, so I need to know how
the send_mail.html.erb template can access the email body.