Routing of result not clear in ActionMailer

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 = "webmaster@example.com"
        @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 ...
    <input type="submit" value="Send" class="primary" />
  <%= %>

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.

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

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 %>
Sent on: <%= @sent_on %>

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

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.

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?

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.

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.

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

Of course! :slight_smile:

Thanx for the real quick support !!