Params: hash

1 view
Skip to first unread message

Jono....@gmail.com

unread,
Aug 28, 2006, 2:19:24 PM8/28/06
to Ruby on Rails: Talk
Hi.

I'm really struggling to get a simple contact from to work.

In my controller I have:

def index
@contact = Contact.new(params[:contact])
Contact::deliver_signup_thanks(@contact)
end

I want to pass @contact into 'deliver_signup_thanks' so it can
reference each item via 'contact.name, contact.email' etc

Can anyone tell me how you do this?

Jono....@gmail.com

unread,
Aug 28, 2006, 2:19:26 PM8/28/06
to Ruby on Rails: Talk

naffis

unread,
Aug 28, 2006, 3:06:18 PM8/28/06
to Ruby on Rails: Talk
Try creating another class to handle your emails, it should extend
ActionMailer. As an example:

Create models/account_notifier.rb

class AccountNotifier < ActionMailer::Base
def signup_thanks(contact)
...
do whatever you want with the information
...
end
end

Call it like this: AccountNotifier.deliver_signup_thanks(@contact)

Creat the following in views:
views/account_notifier/signup_thanks.rhtml

Does that help?

Jono Brain

unread,
Aug 28, 2006, 3:29:35 PM8/28/06
to rubyonra...@googlegroups.com
Hi Naffis

Sorry if I am being very stupid here, have just started learning Ruby.

What I am after knowing is - say I have @contact = params[:contact]
this has has all the values of the submitted form. How do I the get
this into - I think the terminology is an object. I basically want to
be able to do @contactobj.name, @contactobj.email etc to get the
values out.

The reason for this is rather than passing say email, subject etc all
in sperately to the send email function I want to pass them in one go.

naffis

unread,
Aug 28, 2006, 4:03:19 PM8/28/06
to Ruby on Rails: Talk
Jono,

Not stupid, I misunderstood your question. You were on the right track.
You should do something like:

@contact = Contact.new(params[:contact])

That will populate the Contact object. If you're having problems then I
suspect it's because you're not setting up your form properly. The
params get passed as contact[name] and contact[address] for example.
Following this same example, in your html form you need to have
something like:

<%= text_field("contact", "name") %> and <%= text_field("contact",
"address" %>

This will output the html in the format: <input type="text"
name="contact[name]">

Any better?

Jono Brain

unread,
Aug 28, 2006, 4:39:05 PM8/28/06
to rubyonra...@googlegroups.com
Hi Naffis

Thanks again for your help. I'm pretty sure the form is setup
correctly, they are in format like your example.

The following errors:

class ContactController < ApplicationController
layout "main"

def index


@contact = Contact.new(params[:contact])

render :text => @contact.name
end

end

Should I expect this to work?

On 28/08/06, naffis <david...@gmail.com> wrote:
>

naffis

unread,
Aug 28, 2006, 7:43:00 PM8/28/06
to Ruby on Rails: Talk
Yeah that should do it.

Max Muermann

unread,
Aug 28, 2006, 9:55:58 PM8/28/06
to rubyonra...@googlegroups.com
>
> The following errors:
>
> class ContactController < ApplicationController
> layout "main"
>
> def index
> @contact = Contact.new(params[:contact])
> render :text => @contact.name
> end
>
> end
>
> Should I expect this to work?
>

Yes. If it doesn't, do a
p params
as the first statement in the controlle method and have post the output here.

Max

Jono Brain

unread,
Aug 29, 2006, 3:23:02 AM8/29/06
to rubyonra...@googlegroups.com
Hi Max

This is the ouput.

Processing ContactController#index (for 127.0.0.1 at 2006-08-29 08:21:39) [POST]
Session ID: 9cb6b17f2facd4babb4042a50104b004
Parameters: {"commit"=>"Send", "contact"=>{"name"=>"Jono",
"area_of_interest"=>"General", "telephone_number"=>"12345656",
"email"=>"jono....@gmail.com"}, "action"=>"index",
"controller"=>"contact"}

When I try and do @contact.name I get the following error

You have a nil object when you didn't expect it!
The error occured while evaluating nil.name

Max Muermann

unread,
Aug 29, 2006, 5:39:51 AM8/29/06
to rubyonra...@googlegroups.com
On 8/29/06, Jono Brain <jono....@gmail.com> wrote:
>
> Hi Max
>
> This is the ouput.
>
> Processing ContactController#index (for 127.0.0.1 at 2006-08-29 08:21:39) [POST]
> Session ID: 9cb6b17f2facd4babb4042a50104b004
> Parameters: {"commit"=>"Send", "contact"=>{"name"=>"Jono",
> "area_of_interest"=>"General", "telephone_number"=>"12345656",
> "email"=>"jono....@gmail.com"}, "action"=>"index",
> "controller"=>"contact"}
>
> When I try and do @contact.name I get the following error
>
> You have a nil object when you didn't expect it!
> The error occured while evaluating nil.name
>

That's quite bizarre. The parameters are where they should be, and in
any case even if they were not, this would not lead to a nil object.

@contact = Contact.new(...) should *always* result in @contact being
something other than nil.

Can you paste your controller code verbatim please? The only reason I
currently see is a typo somewhere.

Cheers,
Max

Jono Brain

unread,
Aug 29, 2006, 5:50:07 AM8/29/06
to rubyonra...@googlegroups.com
Hi Max

Code is at home, will paste it in when I get back from work today.
Thankyou so much for your help.

On 29/08/06, Max Muermann <ru...@muermann.org> wrote:
>

Jono....@gmail.com

unread,
Aug 29, 2006, 5:01:47 PM8/29/06
to Ruby on Rails: Talk
Hi max

This is the code:

-- controllers/contact_controller.rb --

class ContactController < ApplicationController
layout "main"

def index
p params
if request.post?


@contact = Contact.new(params[:contact])

# Contact::deliver_signup_thanks(@contact)


render :text => @contact.name
end
end

end

-- views/contact/index.rhtml ---

<% @page_title = "contact" %>
<% @page_class = "contact" %>
<div id="ContentPrimary">
<h1><span>contact us</span></h1>
<div id="form">
<% form_for :contact do |form| %>
<h2>lorem ipsum dolor sit amet</h2
<h3>Donec fringilla. Nam odio ipsum, pretium tincidunt, eges tas ut,
hendrerit in, nisl. Suspendisse sagittis sceler isque ipsum</h3>
<%= error_messages_for 'contact' %>

<div class="row input">
<label for="contact_name">Your name:</label>
<%= form.text_field :name %></div>

<div class="row input">
<label for="contact_telephone_number">Your telephone number:</label>
<%= form.text_field :telephone_number %></div>

<div class="row input">
<label for="contact_email">Your email address:</label>
<%= form.text_field :email %></div>

<div class="row select">
<label for="contact_area_of_interest">Area of interest:</label>
<%= select("contact", "area_of_interest", Portfolio.find_all.collect
{|p| [ p.name, p.name ] } ) %></div>

<%= submit_tag "Send" %>
<% end %>
</div>
<div id="address">
<h3>adrian bodie</h3>
<p>Stanley Wharf Mill<br />Kirkebrok Rd<br />Deane<br />Bolton<br
/>BL3 3JE</p>
<div class="telephone">
<h4>telephone</h4>
<p>01294 665 200</p>
</div>
<div class="fax">
<h4>fax</h4>
<p>01294 665 200</p>
</div>
<div class="email">
<h4>email</h4>
<p>in...@adrianbodie.com</p>
</div>
</div>
<div class="cleaner"></div>
</div>

-- models/contact.rb

class Contact < ActionMailer::Base

def signup_thanks( contact )
@body["contact"] = contact

# Email header info MUST be added here
@recipients = contact.email

# Email body substitutions go here

end

end

-- ERROR I GET --

NoMethodError in ContactController#index

You have a nil object when you didn't expect it!
The error occured while evaluating nil.name

RAILS_ROOT: /Users/jono/Sites/adrianbodie/public/../config/..

Application Trace | Framework Trace | Full Trace
#{RAILS_ROOT}/app/controllers/contact_controller.rb:9:in `index'
Request

Parameters: {"commit"=>"Send", "contact"=>{"name"=>"cds",
"area_of_interest"=>"General", "telephone_number"=>"xcacsc",
"email"=>""}}

Show session dump

Response

Headers: {"cookie"=>[], "Cache-Control"=>"no-cache"}

Max Muermann

unread,
Aug 29, 2006, 6:38:11 PM8/29/06
to rubyonra...@googlegroups.com
Aha!

>
> -- models/contact.rb
>
> class Contact < ActionMailer::Base

> ^^^^^^^^^^^^^^^^

There's your problem right there. Contact should inherit from
ActiveRecord if you want to use the Contact.new(hash) method.

Semantically, a contact isw a domain model object, not a Mailer.

I suggest creating a Contact model that inherits from AR (or, if you
don't want to store contacts in the DB, use the active-form plugin)
and a ContactNotifier class which inherits from ActionMailer.

Then in your controller do

...


@contact = Contact.new(params[:contact])

ContactNotifier.deliver_signup_thanks(@contact)
...

That should do the trick.

Cheers,
Max

Jono Brain

unread,
Aug 30, 2006, 3:36:37 AM8/30/06
to rubyonra...@googlegroups.com
Excellent. Thankyou so much Max, much appreciated it. It was driving me crazy.

On 29/08/06, Max Muermann <ru...@muermann.org> wrote:
>

Dot Dot

unread,
Aug 30, 2006, 4:07:10 AM8/30/06
to rubyonra...@googlegroups.com
Max Muermann wrote:
> if you
> don't want to store contacts in the DB, use the active-form plugin)

Hi Max,

May I ask you to elaborate on this? I recently created an object called
query and managed to get it so that I can use the line:

@query = Query.new(params[:query])

by picking it up like this (roughly):

def initialize attributes = nil
unless attributes.nil?
@attributes = attributes
@name = @attributes[:name]
etc..
end
end

I don't want to store queries in the database so Query doesn't inherit
from ActiveRecord but despite the fact that I have used params[] (AND IT
WORKS) I don't fully understand what it does.
Does your post imply that there is a better way to do it than the way I
have done it? (with an active_form plugin?)
Can you explain further?
Karen

--
Posted via http://www.ruby-forum.com/.

Max Muermann

unread,
Aug 30, 2006, 5:58:40 PM8/30/06
to rubyonra...@googlegroups.com
> Hi Max,
>
> May I ask you to elaborate on this? I recently created an object called
> query and managed to get it so that I can use the line:
>
> @query = Query.new(params[:query])
>
> by picking it up like this (roughly):
>
> def initialize attributes = nil
> unless attributes.nil?
> @attributes = attributes
> @name = @attributes[:name]
> etc..
> end
> end
>
> I don't want to store queries in the database so Query doesn't inherit
> from ActiveRecord but despite the fact that I have used params[] (AND IT
> WORKS) I don't fully understand what it does.
> Does your post imply that there is a better way to do it than the way I
> have done it? (with an active_form plugin?)
> Can you explain further?
> Karen
>

active_form gives you a new base class for your models which behaves
exactly like an ActiveRecord, which means you can use validations
easily. Your ActiveForm objects become drop-in replacements for any of
your ActiveRecord classes.

The cases where this is useful are a) you don't need to store the
model content in the database, but you still want to use validations
and scaffolds; and b) your form does not map 1-to-1 to your model, for
example createing more than one model object out of a single form.

Do a google search on validating non-activerecord forms, that shoiuld
turn up a few more pointers.

Cheers,
Max

Reply all
Reply to author
Forward
0 new messages